2016-05-15 2 views
1

Ich arbeite an einem Projekt. Ich möchte ein gleitendes Bild mit Seitenanzeige anzeigen. Sowohl Diashow als auch Seitenanzeige erscheinen in meiner App und wenn ich das Bild scrolle, ändern sich die Bilder erfolgreich und funktionieren einwandfrei. aber mein Seitenindikator ändert sich nicht. es macht mich verwirrt, wenn ich den Code in Eclipse laufen, funktioniert es gut, aber in Android Studio nicht. hier ist mein PageIndicator:Android Seite Indikator für das Verschieben von Bild

public class PageIndicator extends ImageView{ 

private Paint   fillPaint; 
private Paint   strokePaint; 
private int    count; 
private int    indicatorWidth; 
private static final int CIRCLE_RADIUS  = 8; 
private static final int CIRCLE_SPACE  = 10; 
private static final int CIRCLE_STROKE_COLOR = Color.GRAY; 
private static final int CIRCLE_FILL_COLOR = Color.LTGRAY; 
private int    screenWidth; 
private float   offsetX; 
private int    currentPageIndex; 
private float   percent; 


public PageIndicator(Context context) { 
    super(context); 
    initialize(); 
} 


public PageIndicator(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    initialize(); 
} 


public PageIndicator(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    initialize(); 
} 


private void initialize() { 
    fillPaint = new Paint(); 
    fillPaint.setStyle(Style.FILL); 
    fillPaint.setColor(CIRCLE_FILL_COLOR); 
    fillPaint.setAntiAlias(true); 

    strokePaint = new Paint(); 
    strokePaint.setStyle(Style.STROKE); 
    strokePaint.setColor(CIRCLE_STROKE_COLOR); 
    strokePaint.setAntiAlias(true); 


    screenWidth = G.appContext.getResources().getDisplayMetrics().widthPixels; 
} 


public void setIndicatorsCount(int value) { 
    count = value; 
    computeIndicatorWidth(); 
} 


public void setCurrentPage(int value) { 
    currentPageIndex = value; 
} 


public void setPercent(float percent) { 
    this.percent = percent; 
} 


@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    for (int i = 0; i < count; i++) { 
     Paint paint = strokePaint; 
     float radius = CIRCLE_RADIUS; 

     boolean canDrawFill = false; 
     if (i == currentPageIndex) { 
      fillPaint.setAlpha((int) ((1.0f - percent) * 255)); 
      //radius *= 2; 
      canDrawFill = true; 
     } 

     if (percent > 0) { 
      if (i == currentPageIndex + 1) { 
       fillPaint.setAlpha((int) (percent * 255)); 
       canDrawFill = true; 
      } 
     } 
     canvas.drawCircle(offsetX + i * (CIRCLE_RADIUS + CIRCLE_SPACE), 10, radius/2.0f, strokePaint); 

     if (canDrawFill) { 
      canvas.drawCircle(offsetX + i * (CIRCLE_RADIUS + CIRCLE_SPACE), 10, radius/2.0f, fillPaint); 
     } 
    } 
} 


private void computeIndicatorWidth() { 
    indicatorWidth = count * (CIRCLE_RADIUS + CIRCLE_SPACE); 
    offsetX = (screenWidth - indicatorWidth)/2; 
} 

} 

And My ImagePageAdapter

public class ImagePagerAdapter extends PagerAdapter { 

public ArrayList<Integer> imageIds; 
public ArrayList<String> imageTitles; 

public ImagePagerAdapter(ArrayList<Integer> imageIds , ArrayList<String>  imageTitles){ 

    this.imageIds = imageIds; 
    this.imageTitles = imageTitles; 


} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return imageIds.size(); 
} 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    // TODO Auto-generated method stub 
    return view.equals(object); 
} 



@Override 
public Object instantiateItem(ViewGroup container, final int position) { 
    // TODO Auto-generated method stub 

    View view = G.inflater.inflate(R.layout.sliding, null); 
    ImageView image = (ImageView) view.findViewById(R.id.image_sliding); 
    TextView title = (TextView) view.findViewById(R.id.title_sliding); 

    image.setImageResource(imageIds.get(position)); 
    title.setText(imageTitles.get(position)); 




    container.addView(view); 

    return view; 
} 



@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    // TODO Auto-generated method stub 

    container.removeView((View)object); 


} 


} 

und meine Aktivität:

public class HomeActivity extends AppCompatActivity { 

ViewPager pager; 
PageIndicator indicator; 
ArrayList<Integer> imageIds = new ArrayList<>(); 
ArrayList<String> imageTitles = new ArrayList<>(); 

@TargetApi(12) 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home_activity); 
    pager = (ViewPager)findViewById(R.id.Pager); 
    indicator = (PageIndicator)findViewById(R.id.Indicator); 

    indicator.setIndicatorsCount(3); 

    addImageSliding("ofogh_mehr","به افق مهر خوش آمدید"); 
    addImageSliding("sliding_1","تصویر 2"); 
    addImageSliding("sliding_2","تصویر 3"); 




    pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     public void onPageSelected(int arg0) { 
      // TODO Auto-generated method stub 

     } 

     public void onPageScrolled(int startIndex, float percent, int pixel) { 
      // TODO Auto-generated method stub 
      indicator.setPercent(percent); 
      indicator.setCurrentPage(startIndex); 
      Log.i("Scroll", percent+ " " + startIndex ); 

     } 

     public void onPageScrollStateChanged(int arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 


    ImagePagerAdapter adapter = new ImagePagerAdapter(imageIds, imageTitles); 
    pager.setAdapter(adapter); 

} 

@Override 
protected void onResume() { 
    super.onResume(); 
    G.currentActivity = this; 
} 

private void addImageSliding(String name, String title){ 

    int imageID = getApplicationContext(). 
      getResources(). 
      getIdentifier(name, 
        "drawable", getApplicationContext().getPackageName()); 
    imageIds.add(imageID); 
    imageTitles.add(title); 


} 
} 
+0

Können Sie mir Ihr Projekt geben, was Sie von Android-Studie gebaut haben? Ich kann Ihnen helfen, das Problem zu lösen. –

+0

Danke für Ihre Aufmerksamkeit. Aber es gibt noch keinen anderen Code in meinem Projekt. Ich habe nach einer Weile in Eclipse programmiert und bin dann zum Android Studio gewechselt. Ich habe dieses Projekt vor etwa einem Monat (der Code existiert in meinem Post) mit Slideshow erstellt. Es funktioniert gut in Eclipse. Ich habe gerade den Code in meinem Projekt im Android Studio ohne Änderung kopiert und dieses Problem erschien. –

Antwort

2

Warum versucht, das Rad neu zu erfinden?

Sie können einfach einen Seitenindikator mit einem TabLayout erstellen. Keine Notwendigkeit für eine benutzerdefinierte Klasse oder Interaktion mit Ihrer Seite Indikator aus der Aktivität, nur ein wenig von Xml Magic wird den Trick tun.

Nur um klar zu sein, konvertieren wir diese:

enter image description here

etwas wie folgt aus:

enter image description here

In Ihrer Tätigkeit:

TabLayout dots = (TabLayout)findViewById(R.id.dots); 
dots.setupWithViewPager(viewPager, true); // <-- magic here! 

Layout:

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingBottom="@dimen/activity_horizontal_margin"> 
    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="250dp" 
     android:layout_marginBottom="5dp"/> 
    <android.support.design.widget.TabLayout 
     android:id="@+id/dots" 
     android:layout_width="match_parent" 
     android:layout_height="26dp" 
     local:tabBackground="@drawable/dot_selector" 
     local:tabGravity="center" 
     local:tabIndicatorHeight="0dp" 
     local:tabPaddingStart="7dp" 
     local:tabPaddingEnd="7dp"/> 
</LinearLayout> 

tabPaddingStart und tabPaddingEnd wird die Trennung zwischen den Punkten definieren.

Ich habe ein LinearLayout hier für Brevety verwendet, aber Sie könnten verwenden, welches Layout Sie benötigen. Es ist wirklich egal.

dot_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/selected_dot" android:state_selected="true"/> 
    <item android:drawable="@drawable/default_dot"/> 
</selector> 

selected_dot.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
    <shape 
     android:innerRadius="0dp" 
     android:shape="ring" 
     android:thickness="4dp" 
     android:useLevel="false"> 
     <solid android:color="@color/page_indicator_selected_color"/> 
    </shape> 
    </item> 
</layer-list> 

default_dot.xml: genau das gleiche wie selected_dot.xml aber die Farbe zu ändern.

Wie Sie sich denken können, ist android:thickness die Größe des Punktes.

Fertig!

Verwandte Themen