日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Android自定義圓點指示器

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

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

先上效果圖

Android自定義圓點指示器

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

下面是代碼

先定義屬性

<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是總的圓點個數(shù),currentIndex是當(dāng)前頁面的圓點接下來是重寫的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)前頁面的圓點和未選中頁面的圓點要設(shè)置不同的大小 所以分別設(shè)置每個圓點的坐標 然后用for循環(huán)繪制圓點這里有一點要注意 new RectF() 的四個參數(shù)分別是圓點外面的矩形的左上角的X,Y和右下角的X,Y

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

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è)置總的圓點個數(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)刪除圓點的時候 如果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è)置指示器的圓點個數(shù),最后在ViewPager的OnPageChangeListener中設(shè)置當(dāng)前的 頁面的圓點。

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

標簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美+亚洲+精品+三区| 亚洲欧洲一区| 精品久久一区| 视频在线观看一区| 麻豆精品av| 亚洲日本欧美| 99国产精品免费视频观看| 日精品一区二区三区| 久久久久国产| 日本成人手机在线| 免费在线日韩av| 亚洲视频二区| 欧美大黑bbbbbbbbb在线| 91久久精品无嫩草影院| 久久久久久免费视频| 麻豆久久一区| 欧美激情99| 九九久久国产| 青青青国产精品| 日韩精品一区第一页| 欧美在线网站| 国产精品日本| 欧美日韩国产精品一区二区亚洲| 免费在线亚洲欧美| 久久精品欧洲| 国产成人a视频高清在线观看| 国产精品网站在线看| 国产精品久久| 91大神在线观看线路一区| 亚洲精品四区| 国产日韩一区二区三区在线 | 国产伦理久久久久久妇女| 日韩精选在线| 久久99蜜桃| 麻豆理论在线观看| 美女久久久久| 欧美天堂亚洲电影院在线观看| 最新亚洲激情| 日韩一区二区三区四区五区| 日本91福利区| 日韩国产专区| 国产一区二区三区日韩精品| 成人午夜网址| 亚洲伊人影院| 国产a亚洲精品| 欧美日韩精品一本二本三本 | 精品成人免费一区二区在线播放| 日韩天堂在线| 欧美久久一区二区三区| 亚洲日本网址| 青青草精品视频| 久久青草久久| 欧美aa在线视频| 日韩中文字幕亚洲一区二区va在线 | 亚洲成a人片| 久久av影视| 黄色精品网站| 亚洲成人二区| 老鸭窝一区二区久久精品| 精品1区2区3区4区| 麻豆精品国产91久久久久久| 天堂资源在线亚洲| 国产探花一区在线观看| 欧美日韩黑人| 欧美日韩尤物久久| 日本色综合中文字幕| 久久美女精品| аⅴ资源天堂资源库在线| 国产精品美女| 亚洲一区二区三区高清| 精品久久97| 国产剧情一区| 国产精品欧美三级在线观看| 欧美在线综合| 伊人久久亚洲影院| 久久精品观看| 日韩欧美不卡| 国产伦久视频在线观看| 国产精品成人国产| 国产精品亚洲四区在线观看| 亚洲精品大片| 国产精品视频一区二区三区综合| 亚洲精品1区2区| 亚洲电影在线一区二区三区| 欧美va天堂| 大香伊人久久精品一区二区 | 模特精品在线| 首页国产欧美久久| 青青国产精品| 亚洲精品伊人| 日本免费新一区视频| 少妇高潮一区二区三区99| 日韩av一区二区三区四区| 国产一级成人av| 美女av在线免费看| 精品日韩毛片| 日本亚洲不卡| 国产精品v一区二区三区| 精品久久电影| 99视频一区| 欧美日韩18| 日韩欧美一区二区三区免费看| 精精国产xxxx视频在线野外 | 欧美日韩免费看片| 视频一区欧美日韩| 麻豆久久久久久久| 在线视频日韩| 91视频一区| 国产精品美女久久久浪潮软件| 日本精品久久| 精品三级久久久| 男人的天堂久久精品| 精品视频一区二区三区四区五区 | 久久男人av资源站| 日韩深夜视频| 亚洲一级淫片| 国产精品115| 久久精品中文| 久久av国产紧身裤| 99精品99| av综合电影网站| 亚洲丝袜啪啪| 国产精品精品国产一区二区| 国产亚洲精品v| 亚洲永久av| 婷婷精品在线观看| 九色porny丨国产首页在线| 青草av.久久免费一区| 欧美在线网站| 欧洲一级精品| 国产日韩亚洲| 亚洲欧美久久久| 丝袜美腿诱惑一区二区三区| 国产精品亚洲片在线播放| 香蕉精品999视频一区二区| 国产精品国产一区| 国产精品2区| 手机在线电影一区| 国产91在线播放精品| 久久av中文| 1024精品久久久久久久久| 蜜臀va亚洲va欧美va天堂 | 鲁大师精品99久久久| 欧美国产中文高清| 日韩va亚洲va欧美va久久| 国产视频久久| 人在线成免费视频| 欧美亚洲日本精品| 日韩在线观看| 成人羞羞视频在线看网址| 精品国产欧美| 日韩av免费大片| 久久久久久久欧美精品| 亚洲欧美日韩精品一区二区| 五月精品视频| 午夜一级久久| 欧美黄页在线免费观看| 国产不卡精品| 日韩在线观看一区| 天堂网在线观看国产精品| 日韩精品社区| 久久久久.com| 亚洲欧美在线专区| 国产激情一区| 丝袜诱惑制服诱惑色一区在线观看 | 精品亚洲成人| 亚洲精品888| 国产日韩欧美一区二区三区 | 国产一区欧美| 国产精品qvod| 91久久亚洲| 日产精品一区二区| 蜜桃av一区二区三区电影| 免费精品一区| 中文字幕成人| 欧美精品一区二区三区精品| 久久成人福利| 久久xxxx精品视频| 久久香蕉国产| 国产精品啊v在线| 亚洲精品乱码久久久久久蜜桃麻豆| 三级久久三级久久久| 夜夜嗨av一区二区三区网站四季av| 欧美精品不卡| 欧美激情视频一区二区三区免费 | 国产亚洲激情| 亚洲一区中文| 九九久久国产| 少妇精品久久久一区二区| 国产一区二区精品| 精精国产xxxx视频在线野外| 精品国产一区二| 久久99精品久久久野外观看| 中文字幕亚洲在线观看| 亚洲精品影视| 美女91精品| 日本aⅴ亚洲精品中文乱码| 一区二区视频欧美| 日韩精品亚洲一区二区三区免费| 欧美成人精品|