自定义view的开关器===全程自绘

今天又重新写了一下自定义view,并且做了一个小demo,开关器---


其实这个小demo还是非常好实现的,如果熟悉画布(canvas)和画笔(paint)的使用的话,做起来简直是没有任何难度。

见代码:

package bw.com.xiangmu.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import bw.com.xiangmu.R;

/**
 * Created by Administrator on 2017/12/1/001.
 */

public class KaiGuan extends View {

    boolean flag=true;
    private final Paint paint;

    public interface KaiGuanJieKou{
        void kai();
        void guan();
    }
    KaiGuanJieKou kaiGuanJieKou;

    public void setKaiGuanJieKou(KaiGuanJieKou kaiGuanJieKou) {
        this.kaiGuanJieKou = kaiGuanJieKou;
    }

    public KaiGuan(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(75,40);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int measuredWidth = getMeasuredWidth();//当前控件的宽度
        int measuredHeight = getMeasuredHeight();//当前控件的高度

        paint.setStrokeWidth(1);
        paint.setColor(getResources().getColor(R.color.lvse));
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setAntiAlias(true);
        //默认背景开关  左边绿色,右边白圆
        /**
         * 将开关分为三个部分,两边半圆,中间正方形
         */
        int ziwidth = measuredWidth / 3;
        int ziheight = measuredHeight / 2;


        if(flag){
            paint.setColor(getResources().getColor(R.color.qianhuise));
            //最左边绿色半圆  参数1,确认半圆的大小,,参数2,绘制的起始角度,,参数3,是绘制的总和角度,,参数4,是否包含圆心,参数5,画笔
            //参数2和参数3,一定要遵循androidy轴的特殊性,以及参数3的正/逆时针的旋转
            canvas.drawArc(new RectF(0,0,ziwidth*2,measuredHeight),90,180,true,paint);
            //绘制中心的方块
            canvas.drawRect(ziwidth,0,ziwidth*2,measuredHeight,paint);
            //绘制最右边的半圆
            canvas.drawArc(new RectF(ziwidth,0,measuredWidth,measuredHeight),90,-180,true,paint);

            //移动器
            paint.setStrokeWidth(1);
            paint.setColor(Color.WHITE);
            paint.setStyle(Paint.Style.FILL_AND_STROKE);
            paint.setAntiAlias(true);
            //左边鱼眼  参数1,圆心的x坐标,参数2,圆心的y轴坐标,,参数3,圆的半径
            canvas.drawCircle(ziwidth,ziheight,ziheight-2,paint);
        }else{

            //最左边绿色半圆  参数1,确认半圆的大小,,参数2,绘制的起始角度,,参数3,是绘制的总和角度,,参数4,是否包含圆心,参数5,画笔
            //参数2和参数3,一定要遵循androidy轴的特殊性,以及参数3的正/逆时针的旋转
            canvas.drawArc(new RectF(0,0,ziwidth*2,measuredHeight),90,180,true,paint);
            //绘制中心的方块
            canvas.drawRect(ziwidth,0,ziwidth*2,measuredHeight,paint);
            //绘制最右边的半圆
            canvas.drawArc(new RectF(ziwidth,0,measuredWidth,measuredHeight),90,-180,true,paint);

            //移动器  默认在右边
            paint.setStrokeWidth(1);
            paint.setColor(Color.WHITE);
            paint.setStyle(Paint.Style.FILL_AND_STROKE);
            paint.setAntiAlias(true);
            //右边鱼眼  参数1,圆心的x坐标,参数2,圆心的y轴坐标,,参数3,圆的半径
            canvas.drawCircle(ziwidth*2,ziheight,ziheight-2,paint);
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN){
                int x = (int)event.getX();
                if(x <getMeasuredWidth()/2){
                    flag=true;
                    kaiGuanJieKou.guan();
                }else{
                    flag=false;
                    kaiGuanJieKou.kai();
                }
            }
        postInvalidate();
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40430041/article/details/79209769
今日推荐