自定义view 圆点指示器(选中可拉伸) DotIndicate

自定义view代码,继承view

package com.example.myapplication;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;

/**
 * 原点加选中拉伸指示器
 * create by lihui
 */
public class DotIndicate extends View {

    private static final int DEFAULT_DOT_NUMBER  = 3;
    private int dotNumber = DEFAULT_DOT_NUMBER;
    private int norMalColor = Color.GRAY;
    private int selectColor = Color.WHITE;
    private boolean enableStretch = true;
    private int stretchSize = 10;
    private int dotInterval = 10;
    private int dotRadio = 3;

    private Paint paint;

    private int selectIndex = 0;

    private RectF rect;

    public DotIndicate(Context context) {
        this(context,null);

    }

    public DotIndicate(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public DotIndicate(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.DotIndicate);
        dotNumber = typedArray.getInt(R.styleable.DotIndicate_dotNumber, DEFAULT_DOT_NUMBER);
        norMalColor = typedArray.getColor(R.styleable.DotIndicate_normalColor,Color.GRAY);
        selectColor = typedArray.getColor(R.styleable.DotIndicate_selectColor,Color.WHITE);
        enableStretch = typedArray.getBoolean(R.styleable.DotIndicate_stretchEnable,true);
        stretchSize = dp2px(context,typedArray.getDimension(R.styleable.DotIndicate_stretchSize,10));
        dotInterval = dp2px(context,typedArray.getDimension(R.styleable.DotIndicate_dotInterval,10));
        dotRadio = dp2px(context,typedArray.getDimension(R.styleable.DotIndicate_dotRadio,3));

        typedArray.recycle();
        paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);
        paint.setColor(norMalColor);
        rect = new RectF(0,0,stretchSize,dotRadio * 2);
    }

    private int dp2px(Context context ,float dp) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        float density = displayMetrics.density;
        return (int)(density * dp + 0.5);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if (widthMode == MeasureSpec.AT_MOST) {
            widthSize = calculateWidthSize();
        }
        if (heightMode == MeasureSpec.AT_MOST) {
            heightSize = dotRadio * 2;
        }

        setMeasuredDimension(widthSize,heightSize);
    }

    private int calculateWidthSize() {
        int selectDotWidth = dotRadio * 2;
        int normalDotWidth = dotRadio * 2;
        if (enableStretch) {
            selectDotWidth += stretchSize;
        }
        return selectDotWidth + (dotNumber - 1) * (normalDotWidth + dotInterval);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int currentLeft = 0;
        for (int i = 0; i < dotNumber ; i ++) {
            if (selectIndex == i) {
                paint.setColor(selectColor);
                if (enableStretch) {
                    rect.set(currentLeft,0,currentLeft + stretchSize,dotRadio * 2);
                    canvas.drawRoundRect(rect, dotRadio,dotRadio,paint );
                    currentLeft += (stretchSize + dotInterval);
                } else {
                    canvas.drawCircle(currentLeft + dotRadio,dotRadio,dotRadio,paint);
                    currentLeft += (2 * dotRadio + dotInterval);
                }
            } else {

                paint.setColor(norMalColor);
                canvas.drawCircle(currentLeft + dotRadio,dotRadio,dotRadio,paint);
                currentLeft += (2 * dotRadio + dotInterval);
            }
        }
    }

    public void setSelect(int index) {
        selectIndex = index;
        invalidate();
    }
}

自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="DotIndicate" >
        <attr name="normalColor" format="color"/>
        <attr name="selectColor" format="color"/>
        <attr name="dotRadio" format="dimension"/>
        <attr name="dotNumber" format="integer"/>
        <attr name="stretchEnable" format="boolean"/>
        <attr name="stretchSize" format="dimension"/>
        <attr name="dotInterval" format="dimension"/>
    </declare-styleable>

</resources>

使用方式

 <com.example.myapplication.DotIndicate
        android:id="@+id/di"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:dotNumber="7"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
DotIndicate viewById = findViewById(R.id.di);
        viewById.setSelect(3);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 圆点指示器常用于 ViewPager、RecyclerView 等控件的指示,用于表示当前显示页面的位置。一般来说,可以通过自定义 View 或者使用第三方库来实现圆点指示器。 以下是使用自定义 View 实现圆点指示器的基本步骤: 1. 创建一个自定义 View 类,继承自 View。 2. 在自定义 View 的构造函数中初始化相关参数,如圆点的颜色、大小、间距等。 3. 重写 onMeasure 方法,设置自定义 View 的大小。 4. 重写 onDraw 方法,在画布上绘制圆点。 5. 在需要使用圆点指示器的地方,将自定义 View 添加到布局中即可。 以下是一个简单的圆点指示器示例代码: ```java public class CircleIndicatorView extends View { private static final int DEFAULT_COLOR = Color.WHITE; private static final int DEFAULT_RADIUS = 10; private static final int DEFAULT_SPACING = 20; private int mCircleColor = DEFAULT_COLOR; private int mCircleRadius = DEFAULT_RADIUS; private int mCircleSpacing = DEFAULT_SPACING; private int mCount = 0; private int mCurrent = 0; public CircleIndicatorView(Context context) { super(context); } public CircleIndicatorView(Context context, AttributeSet attrs) { super(context, attrs); } public CircleIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setCount(int count) { mCount = count; invalidate(); } public void setCurrent(int current) { mCurrent = current; invalidate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = mCircleRadius * 2 * mCount + mCircleSpacing * (mCount - 1); int height = mCircleRadius * 2; setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i = 0; i < mCount; i++) { int cx = mCircleRadius + (mCircleRadius * 2 + mCircleSpacing) * i; int cy = mCircleRadius; canvas.drawCircle(cx, cy, mCircleRadius, mCircleColor); if (i == mCurrent) { canvas.drawCircle(cx, cy, mCircleRadius - 5, DEFAULT_COLOR); } } } } ``` 在布局文件中引用该自定义 View: ```xml <com.example.CircleIndicatorView android:id="@+id/circle_indicator_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" app:circleColor="#FF0000" app:circleRadius="10dp" app:circleSpacing="20dp" /> ``` 注意,在自定义 View 中使用属性时需要在 attrs.xml 文件中定义对应的属性。 当然,还有很多第三方库可以实现圆点指示器,比如 ViewPagerIndicator、SmartTabLayout 等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值