自定义view之自定义圆环

首先呢,在res文件之下,你的创建attrs文件,在里面把你需要的属性定义出来

<resources>
    <declare-styleable name="Zidingyi">
        <attr name="outban" format="integer"></attr>
        <attr name="inban" format="integer"></attr>
        <attr name="colorhuan" format="color"></attr>
        <attr name="texts" format="string"></attr>
        <attr name="textsize" format="integer"></attr>
    </declare-styleable>
</resources>
然后是布局里面,给你定义的属性赋值

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    重点是这行******
   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.bawei.ZidingyiYuan.view.Zidingyi
        android:id="@+id/myview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:outban="100"
        app:inban="50"
        app:colorhuan="#fff000"
        app:texts="圆环"
        app:textsize="20"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>
接下来就是代码了,创建一个类继承view,不多说了,直接看代码
public class Zidingyi extends View {

    private int outban;
    private int inban;
    private int textsize;
    private int colorhuan;
    private String texts;
    private int currentX;
    private int currentY;
    //声明接口
    public OnViewItemClickListener onViewItemClickListener;
    //定义接口
    public interface OnViewItemClickListener{
        void onViewItemClick(String texts);
    }
    //对外提供一个set方法
    public void setOnViewItemClickListener(OnViewItemClickListener onViewItemClickListener){
        this.onViewItemClickListener=onViewItemClickListener;
    }
    public Zidingyi(Context context) {
        super(context);
    }

    public Zidingyi(Context context, AttributeSet attrs) {
        super(context, attrs);
        initview(attrs);
    }

    public Zidingyi(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private void initview(AttributeSet attrs) {
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.Zidingyi);
        inban = typedArray.getInt(R.styleable.Zidingyi_inban, 0);
        outban = typedArray.getInt(R.styleable.Zidingyi_outban, 0);
        textsize = typedArray.getInt(R.styleable.Zidingyi_textsize, 0);
        colorhuan = typedArray.getColor(R.styleable.Zidingyi_colorhuan, 0);
        texts = typedArray.getString(R.styleable.Zidingyi_texts);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(outban * 2, outban * 2);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        currentX = getMeasuredWidth() / 2;
        currentY = getMeasuredWidth() / 2;
        canvas.drawColor(Color.GREEN);
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);
        paint.setColor(colorhuan);
        canvas.drawCircle(currentX, currentY, outban, paint);

        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);
        paint.setColor(Color.WHITE);
        canvas.drawCircle(currentX, currentY, inban, paint);

        paint.setTextSize(textsize);
        paint.setColor(Color.BLACK);
        canvas.drawText(texts, currentX - texts.length() / 2 * textsize, currentY + textsize / 2, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                double sqrt = Math.sqrt((currentX - x) * (currentX - x) + (currentY - y) * (currentY - y));
                String texts = "";
                if (sqrt < inban) {
                    texts = "在小圆内";
                } else if (sqrt < outban && sqrt > inban) {
                    texts = "在大圆内";
                }else if(sqrt>outban){
                    texts="在圆环外";
                }
                if(onViewItemClickListener!=null){
                    onViewItemClickListener.onViewItemClick(texts);
                }
                break;
        }
        return true;
    }
}
最后是mainActivity里面,接口回调,
public class MainActivity extends AppCompatActivity {
    private Zidingyi myview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myview= (Zidingyi) findViewById(R.id.myview);
        myview.setOnViewItemClickListener(new Zidingyi.OnViewItemClickListener() {
            @Override
            public void onViewItemClick(String texts) {
                Toast.makeText(MainActivity.this,texts,Toast.LENGTH_SHORT).show();
            }
        });

    }
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值