自定義控件之圓形viewpager導(dǎo)航circleindicator

本文主要是做一個(gè)和viewpager聯(lián)動(dòng)的圓形指示器,圓的半徑顏色都可以在布局文件中指定。但是本文沒做。

Paste_Image.png
public class CircleIndicator2 extends View {
    //默認(rèn)圓半徑
    private int radius=15;
    //當(dāng)前指示圓半徑
    private float selectedRadius;
    private int width;
    private int count;
    private Paint paint;
    private Paint selectedPaint;
    private int height;
    private float current;
    public CircleIndicator2(Context context) {
        this(context,null);
    }
    public CircleIndicator2(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public CircleIndicator2(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //默認(rèn)圓畫筆
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.GRAY);
        //當(dāng)前指示圓畫筆
        selectedPaint = new Paint();
        selectedPaint.setAntiAlias(true);
        selectedPaint.setColor(Color.RED);
    }
    @Override 
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        height = getMeasuredHeight();
        width = getMeasuredWidth();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //這個(gè)距離如下圖所示
        int distance=width/(count+1);
        //灰色圓
        for(int i=0;i<count;i++){
            canvas.drawCircle(distance*(i+1),height/2,radius,paint);
        }          
        //紅色圓
        canvas.drawCircle(current,height/2,selectedRadius,selectedPain);
}
//和viewpager聯(lián)動(dòng)
    public void setUpWithViewPager(ViewPager viewPager){
        if(viewPager==null){
            return;
        }
        //確定要畫幾個(gè)圓
        count=viewPager.getAdapter().getCount();
        viewPager.addOnPageChangeListener(new
        ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                setCircleSize(position,positionOffset,positionOffsetPixels);
            }
            @Override
            public void onPageSelected(int position) {}
            @Override
            public void onPageScrollStateChanged(int state) {            }        });
    }
    //設(shè)置紅色圓移動(dòng)的距離
    private void setCircleSize(int position, float positionOffset, int positionOffsetPixels) {        Log.d("xxxxx",position+"/"+positionOffset+"/"+positionOffsetPixels);
        int distance=width/(count+1);
        current = (position+1)*distance+distance*positionOffset;
        //設(shè)置紅色圓的大小,
        selectedRadius=radius+3*(1+0);
        invalidate();
    }
}

補(bǔ)充說明

Paste_Image.png

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="vcredit.com.pathdatademo.MainActivity">
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    <com.pathdatademo.CircleIndicator2
        android:id="@+id/circleview"
        android:layout_width="200dp"
        android:layout_height="20dp"
       android:layout_alignParentBottom="true"
        android:layout_marginBottom="40dp"
        android:layout_centerHorizontal="true"
        />
</RelativeLayout>

代碼中使用

public class MainActivity extends AppCompatActivity {
    private ArrayList<Fragment> tabs;
    @Override    protected void onCreate(Bundle
 savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewPager viewPager= (ViewPager)findViewById(R.id.viewpager);
        CircleIndicator2 circleIndicator= (CircleIndicator2)findViewById(R.id.circleview);
        SimpleFragment one=SimpleFragment.instance("one");
        SimpleFragment two=SimpleFragment.instance("two");
        SimpleFragment three=SimpleFragment.instance("three");
        SimpleFragment four=SimpleFragment.instance("four");
        SimpleFragment five=SimpleFragment.instance("five");
        SimpleFragment six=SimpleFragment.instance("six");
        tabs = new ArrayList<>();
        tabs.add(one);
        tabs.add(two);
        tabs.add(three);
        tabs.add(four);
        tabs.add(five);
        tabs.add(six);
        viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return tabs.get(position);
            }
            @Override
            public int getCount() {
                return tabs.size();     
          } 
       });
        circleIndicator.setUpWithViewPager(viewPager);
    }
}

viewpager中用到的fragment

public class SimpleFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_layout,container,false);
    }
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        String content=getArguments().getString("content");
        TextView tv= (TextView) view.findViewById(R.id.tv);
        tv.setText(content);
    }
    public static SimpleFragment instance(String content){
        SimpleFragment simpleFragment=new SimpleFragment();
        Bundle bundle=new Bundle();
        bundle.putString("content",content);
        simpleFragment.setArguments(bundle);
        return simpleFragment;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,349評論 25 708
  • 重溫這脫落的記憶 你的柔長的睫毛掃過我的臉龐 你的每一次呼吸 我都能感覺到 跟隨你的呼吸 我來到你的故鄉(xiāng) 可最后黎...
    chzw閱讀 152評論 1 2
  • 昨天幾乎一夜沒睡。 早上的晨間思幾乎是閉著眼睛在說話。之所以沒睡好一方面是在擔(dān)心老公趕夜車回上海路上是否安全,另一...
    Super_Luna閱讀 192評論 0 0
  • 今天只說宋代的兩位大詞人:柳永,蘇軾 蘇軾又名蘇東坡,在被貶謫的日子里,自覺心境大開,不再為外物所累,而且覺得跟佛...
    四體二用閱讀 1,016評論 0 1