国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Android自定義圓點(diǎn)指示器

瀏覽:2日期:2022-09-18 09:08:48

本文實例為大家分享了Android自定義圓點(diǎn)指示器的具體代碼,供大家參考,具體內(nèi)容如下

先上效果圖

Android自定義圓點(diǎn)指示器

大概思路就是自定義View 從左至右繪制圓點(diǎn) 然后在ViewPager的OnPageChangeListener中設(shè)置當(dāng)前頁面的圓點(diǎn)

下面是代碼

先定義屬性

<resources> <attr name='selectedColor' format='color'/> <attr name='unselectedColor' format='color'/> <declare-styleable name='Indicator'><attr name='selectedColor'/><attr name='unselectedColor'/> </declare-styleable></resources>

接下來是自定義的View

public class Indicator extends View{ private static final int DEFAULT_TOTAL_INDEX = 5; private static final int DEFAULT_CURRENT_INDEX = 0; private static final int DEFAULT_CIRCLE_DISTANCE = 40; private static final int DEFAULT_CIRCLE_RADIUS = 8; private static final int DEFAULT_CIRCLE_SELECTED_RADIUS = 11; private int selectedColor; private int unselectedColor; private int currentIndex; private int totalIndex; private Paint paint; private int startX; private int startSelectedY; private int startY; private int centreX; public Indicator(Context context) {this(context,null); } public Indicator(Context context, AttributeSet attrs) {this(context, attrs,0); } public Indicator(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.Indicator,defStyleAttr,0);selectedColor = typedArray.getColor(R.styleable.Indicator_selectedColor, Color.LTGRAY);unselectedColor = typedArray.getColor(R.styleable.Indicator_unselectedColor,Color.WHITE);typedArray.recycle();totalIndex = DEFAULT_TOTAL_INDEX;currentIndex = DEFAULT_CURRENT_INDEX;paint = new Paint(); }

從TypedArray中獲取自定義的屬性,totalIndex是總的圓點(diǎn)個數(shù),currentIndex是當(dāng)前頁面的圓點(diǎn)接下來是重寫的OnDraw()方法

@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);centreX = getWidth() / 2;startSelectedY = getHeight() / 2 - DEFAULT_CIRCLE_SELECTED_RADIUS;startY = getHeight() / 2 - DEFAULT_CIRCLE_RADIUS;if (totalIndex % 2 == 0){ startX = centreX - (int)(1.0 * (totalIndex - 1)/2 * DEFAULT_CIRCLE_DISTANCE);}else{ startX = centreX - totalIndex / 2 * DEFAULT_CIRCLE_DISTANCE;}paint.setAntiAlias(true);paint.setColor(unselectedColor);int tempX = startX;for(int i = 0 ; i < totalIndex ; i++ ){ RectF rectF = new RectF(tempX - DEFAULT_CIRCLE_RADIUS,startY, tempX + DEFAULT_CIRCLE_RADIUS,startY + 2 * DEFAULT_CIRCLE_RADIUS); if (i == currentIndex) {paint.setColor(selectedColor);rectF = new RectF(tempX - DEFAULT_CIRCLE_SELECTED_RADIUS,startSelectedY,tempX + DEFAULT_CIRCLE_SELECTED_RADIUS,startSelectedY + 2 * DEFAULT_CIRCLE_SELECTED_RADIUS); } canvas.drawOval(rectF,paint); if (paint.getColor() == selectedColor)paint.setColor(unselectedColor); tempX += DEFAULT_CIRCLE_DISTANCE;} }

因為當(dāng)前頁面的圓點(diǎn)和未選中頁面的圓點(diǎn)要設(shè)置不同的大小 所以分別設(shè)置每個圓點(diǎn)的坐標(biāo) 然后用for循環(huán)繪制圓點(diǎn)這里有一點(diǎn)要注意 new RectF() 的四個參數(shù)分別是圓點(diǎn)外面的矩形的左上角的X,Y和右下角的X,Y

接下來是設(shè)置當(dāng)前頁面的圓點(diǎn)的方法

public void setCurrentIndex(int currentIndex){//if (currentIndex < 0)// currentIndex += totalIndex ;//if (currentIndex > totalIndex - 1)// currentIndex %= totalIndex;this.currentIndex = currentIndex;invalidate(); }

注釋里的代碼是當(dāng)頁面可以循環(huán)的時候設(shè)置的接下來是設(shè)置總的圓點(diǎn)個數(shù)的方法

public void setTotalIndex(int totalIndex){int oldTotalIndex = this.totalIndex;if (totalIndex < 1) return;if (totalIndex < oldTotalIndex){ if (currentIndex == totalIndex )currentIndex = totalIndex - 1;}this.totalIndex = totalIndex;invalidate(); }

當(dāng)刪除圓點(diǎn)的時候 如果currentIndex是最后一個 讓currentIndex向前移動接下來是重寫的OnMeasure()方法

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec)); } private int measureHeight(int measureSpec){int result;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);int desired = DEFAULT_CIRCLE_SELECTED_RADIUS * 2 + getPaddingBottom() + getPaddingTop();if(specMode == MeasureSpec.EXACTLY) { result = Math.max(desired,specSize);}else{ if(specMode == MeasureSpec.AT_MOST){result = Math.min(desired,specSize); } else result = desired;}return result; } private int measureWidth(int measureSpec){int result;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);int desired = (totalIndex - 1) * DEFAULT_CIRCLE_DISTANCE + DEFAULT_CIRCLE_SELECTED_RADIUS * 2 + getPaddingLeft() + getPaddingRight();if(specMode == MeasureSpec.EXACTLY) { result = Math.max(desired,specSize);}else{ if(specMode == MeasureSpec.AT_MOST){result = Math.min(desired,specSize); }else result = desired;}return result; }

下面是MainActivity的布局代碼,很簡單

<RelativeLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:tools='http://schemas.android.com/tools' xmlns:app='http://schemas.android.com/apk/res-auto' android:layout_width='match_parent' android:layout_height='match_parent' tools:context='com.example.lzh123.learnviewpager.MainActivity'> <android.support.v4.view.ViewPagerandroid: android:layout_width='match_parent'android:layout_height='match_parent'/> <com.example.lzh123.learnviewpager.Indicatorapp:selectedColor='#FFFFFF'app:unselectedColor='#C7C7C7'android: android:layout_centerInParent='true'android:layout_width='wrap_content'android:layout_height='wrap_content' /> </RelativeLayout>

下面是MainActivity的代碼

public class MainActivity extends AppCompatActivity { View layout1,layout2,layout3; ViewPager viewPager; Indicator indicator; List<View> viewList; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.viewPager);LayoutInflater inflater = getLayoutInflater();layout1 = inflater.inflate(R.layout.layout1,null);layout2 = inflater.inflate(R.layout.layout2,null);layout3 = inflater.inflate(R.layout.layout3,null); viewList = new ArrayList<>();viewList.add(layout1);viewList.add(layout2);viewList.add(layout3); indicator = (Indicator) findViewById(R.id.indicator);indicator.setTotalIndex(viewList.size());PagerAdapter pagerAdapter = new PagerAdapter() { @Override public int getCount() {return viewList.size(); } @Override public void destroyItem(ViewGroup container, int position, Object object) {container.removeView(viewList.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) {container.addView(viewList.get(position)); return position; } @Override public boolean isViewFromObject(View view, Object object) {return view == viewList.get(Integer.parseInt(object.toString())); }}; viewPager.setAdapter(pagerAdapter);viewPager.setOnPageChangeListener(new PageChangeListener()); } public class PageChangeListener implements ViewPager.OnPageChangeListener{ @Overridepublic void onPageSelected(int position) { indicator.setCurrentIndex(position);} @Overridepublic void onPageScrollStateChanged(int state) { } @Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } }

ViewPager里添加了三個空頁面 然后設(shè)置指示器的圓點(diǎn)個數(shù),最后在ViewPager的OnPageChangeListener中設(shè)置當(dāng)前的 頁面的圓點(diǎn)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 亚洲日本va午夜中文字幕一区 | 久久国产欧美另类久久久 | 久久精品香蕉视频 | 免费看久久 | 国产男女乱淫真视频全程播放 | 一级毛片欧美大片 | 国产免费观看a大片的网站 国产免费黄色网址 | 免费播放欧美毛片欧美a | 三级伦理网站 | 好吊操这里只有精品 | 精品欧美激情在线看 | 亚洲成av人片在线观看无码 | 孕妇xxxx视频在线 | 91人成亚洲高清在线观看 | 成人永久福利在线观看不卡 | 国产日韩欧美精品一区二区三区 | 免费在线成人网 | 欧洲成人全免费视频网站 | 色综合视频一区二区观看 | 正在播真实出轨炮对白 | 成人精品亚洲 | 3级黄色 | 欧美一区二区三区不卡 | 好男人天堂网 | 国产精品外围在线观看 | 久草青青视频 | 一级国产精品一级国产精品片 | 特黄特级a级黄毛片免费观看多人 | 日韩激情无码免费毛片 | 在线欧美色 | 偷看各类wc女厕嘘在线观看 | 91国语精品自产拍在线观看一 | 久久性妇女精品免费 | 99久久国内精品成人免费 | 日本无卡码一区二区三区 | 经典三级在线视频 | 久久久国产精品视频 | 亚洲深夜福利视频 | 在线观看日本污污ww网站 | 中文字幕99在线精品视频免费看 | 日韩高清一级 |