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

您的位置:首頁技術文章
文章詳情頁

Android自定義圓點指示器

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

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

先上效果圖

Android自定義圓點指示器

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

下面是代碼

先定義屬性

<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是總的圓點個數,currentIndex是當前頁面的圓點接下來是重寫的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;} }

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

接下來是設置當前頁面的圓點的方法

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

注釋里的代碼是當頁面可以循環的時候設置的接下來是設置總的圓點個數的方法

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(); }

當刪除圓點的時候 如果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里添加了三個空頁面 然后設置指示器的圓點個數,最后在ViewPager的OnPageChangeListener中設置當前的 頁面的圓點。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩高清成人| 欧美日韩在线精品一区二区三区激情综合| 日韩欧美精品综合| 99香蕉国产精品偷在线观看| 99久久夜色精品国产亚洲1000部| 91精品一区二区三区综合在线爱 | 久久免费大视频| 精品资源在线| 精品国产午夜| 极品av在线| 欧美日韩免费观看视频| 久久婷婷丁香| 99国产精品免费视频观看| 欧美日韩国产在线观看网站| 婷婷精品进入| 欧美日韩一二| 亚洲综合国产| 日本久久一区| 久久影院资源站| 97精品一区二区| 群体交乱之放荡娇妻一区二区| 成人av二区| 亚洲毛片一区| 欧美国产不卡| 涩涩av在线| 精品中文一区| 日韩精品一区二区三区中文| 国产精品成人国产| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 午夜亚洲精品| 欧美一级二区| 日韩欧美午夜| 欧美中文日韩| 久久激情五月激情| 美女精品在线| 极品日韩av| 色狠狠一区二区三区| 人人草在线视频| 国产精品永久| 国产精品久久久久毛片大屁完整版| 亚洲电影有码| 97人人精品| 美女久久久久| 婷婷综合国产| 成人亚洲一区| 亚洲欧美久久久| 国产三级一区| 韩国精品主播一区二区在线观看 | 国产亚洲精品精品国产亚洲综合| 日韩大片在线播放| 首页国产欧美久久| 国产精品调教| 亚洲福利专区| 欧美精品中文| 香蕉成人av| 亚洲小说春色综合另类电影| 麻豆精品视频在线观看视频| 国产精品88久久久久久| 欧美伊人影院| 欧美肉体xxxx裸体137大胆| 日韩精品欧美大片| 日韩精品久久久久久久电影99爱 | 亚洲欧美日韩国产一区| 久久精品一区| 一级成人国产| 99热国内精品| 国产精品欧美日韩一区| 亚洲精品99| 国产精品一在线观看| 欧美在线资源| 国语精品一区| 日本91福利区| 国产日韩亚洲| 久久久精品午夜少妇| 快播电影网址老女人久久| 亚洲欧洲国产精品一区| 日本欧美久久久久免费播放网| 蜜桃视频第一区免费观看| 视频在线在亚洲| 国产精品欧美在线观看| 日韩久久电影| 国产探花一区| 亚洲人成在线影院| 久久精品二区亚洲w码| 国产一级久久| 日韩精品午夜| 精品视频自拍| 国产欧美一区二区三区米奇| 久久亚洲视频| 久久蜜桃av| 国产一区二区三区成人欧美日韩在线观看 | 欧美永久精品| 久久亚洲不卡| 欧洲激情综合| 激情亚洲影院在线观看| 麻豆视频一区| 天堂va欧美ⅴa亚洲va一国产| 日本精品不卡| 国内自拍视频一区二区三区| 国产精品毛片视频| 日本亚州欧洲精品不卡| 影音国产精品| 国产99亚洲| 在线天堂中文资源最新版| 精品亚洲成人| 精品久久99| 精品视频亚洲| 精品一区二区三区中文字幕视频| 国产欧美自拍| 日韩国产成人精品| 日韩激情一区二区| 欧美天堂视频| 免费日韩成人| 欧美日韩午夜| 日本强好片久久久久久aaa| 亚洲精品网址| 欧美成人精品| 色婷婷精品视频| 91免费精品| 91精品国产乱码久久久久久久| 日韩av免费大片| 中文一区一区三区免费在线观 | 久久影院资源站| 国产精品超碰| 久久久久九九精品影院| 黄色精品视频| 麻豆视频在线观看免费网站黄 | 亚洲黄色免费看| 欧美激情视频一区二区三区免费 | 欧美亚洲免费| 国产精品一区二区精品视频观看 | 欧美国产极品| 精品成人18| 在线手机中文字幕| 久久精品国产99久久| 欧美日韩国产高清| 日韩午夜精品| 亚洲一级淫片| 国产精品网在线观看| 欧美国产极品| 日韩免费小视频| 伊人精品在线| 日欧美一区二区| 国产精品久久| 久久精品欧洲| 日韩不卡在线| 中文一区在线| 欧美一区网站| 国产精品13p| 狠狠久久婷婷| 日韩激情网站| 久久一区精品| 999精品一区| 一区二区三区四区在线观看国产日韩 | 麻豆久久一区| 久久精品91| 影音国产精品| 91精品国产自产精品男人的天堂| 国产精品hd| 91精品精品| 一区二区三区午夜视频| 国产精品中文字幕亚洲欧美| 日韩久久视频| 国产视频一区免费看| 青青草国产精品亚洲专区无| 国产a亚洲精品| 亚洲欧美日韩一区在线观看| 国产精品调教| 欧美jjzz| 欧美日韩黄网站| 日本精品在线中文字幕| 国产一级一区二区| 久久超级碰碰| 精品一区免费| 国产精品永久| 91成人精品| 国产精品亚洲二区| 91九色精品| 国产精区一区二区| 亚洲网站视频| 国产另类在线| 亚洲免费播放| 久久99高清| 老鸭窝毛片一区二区三区| 美腿丝袜在线亚洲一区| 婷婷中文字幕一区| 日韩一区二区三区免费视频| www.九色在线| 日韩国产91| 欧美日韩国产传媒| 美腿丝袜亚洲一区| 男人的天堂亚洲一区| av在线最新| 日韩国产高清在线| 91精品国产成人观看| 国产精品xvideos88| 视频精品一区二区| 日本免费久久| 美腿丝袜亚洲一区| 免费在线观看不卡|