自定义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,一定要遵循android的y轴的特殊性,以及参数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,一定要遵循android的y轴的特殊性,以及参数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; } }