网友通过本文主要向大家介绍了自定义开关控件,自定义控件,android 自定义控件,安卓自定义控件,c#自定义控件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
自定义控件——开关按钮ToggleButton,控件togglebutton
实现一个类似于ToggleButton的开关按钮
效果图:
资源图片:
1.自定义控件类
1 package com.dc.customview.view; 2 3 import com.dc.customview.R; 4 5 import android.content.Context; 6 import android.graphics.Bitmap; 7 import android.graphics.BitmapFactory; 8 import android.graphics.Canvas; 9 import android.util.AttributeSet; 10 import android.view.MotionEvent; 11 import android.view.View; 12 13 public class CustomToggleButton extends View { 14 private boolean state;//开关状态,默认false,关 15 private boolean isTounching;//是否触摸状态 16 private int currentX; 17 private Bitmap backBitmap; 18 private Bitmap overBitmap; 19 20 /** 21 * 有style文件时调用 22 * @param context 23 * @param attrs 24 * @param defStyle 25 */ 26 public CustomToggleButton(Context context, AttributeSet attrs, int defStyle) { 27 super(context, attrs, defStyle); 28 } 29 30 /** 31 * xml中调用 32 * @param context 33 * @param attrs 34 */ 35 public CustomToggleButton(Context context, AttributeSet attrs) { 36 super(context, attrs); 37 } 38 /** 39 * java代码中调用 40 * @param context 41 */ 42 public CustomToggleButton(Context context) { 43 super(context); 44 } 45 46 /** 47 * 设置开关状态 48 * @param value 49 */ 50 public void setState(boolean value){ 51 this.state = value; 52 } 53 /** 54 * 获取开关状态 55 * @param value 56 * @return 57 */ 58 public boolean getState(boolean value){ 59 return state; 60 } 61 62 /** 63 * 先拿到自定义控件需要的两张图片,并且设置自定义控件的宽高 64 * 如果不设置,则这个自定义控件可以接收到全屏的触摸事件,即相当于这个自定义控件占了全屏 65 * @param widthMeasureSpec 66 * @param heightMeasureSpec 67 */ 68 @Override 69 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 70 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 71 //底层图片 72 backBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background); 73 //上层图片 74 overBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button_background); 75 76 //宽高 和 底层图片一样 77 setMeasuredDimension(backBitmap.getWidth(), backBitmap.getHeight()); 78 } 79 80 /** 81 * 绘制开关 82 * @param canvas 83 */ 84 @Override 85 protected void onDraw(Canvas canvas) { 86 super.onDraw(canvas); 87 //1.绘制底层图片 88 canvas.drawBitmap(backBitmap, 0, 0, null); 89 90 //2.绘制上层图片 91 if(isTounching){//上层图片跟随滑动 92 93 /* 94 * 防止上层图片滑动出下层图片的范围 95 */ 96 //算出当前触摸点为上层图片的中心点时,上层图片的左侧坐标距离 97 int left = currentX-overBitmap.getWidth()/2; 98 99 if(left<0){//防止左侧出界 100 left = 0; 101 }else if(left > backBitmap.getWidth() - overBitmap.getWidth()){//防止右侧出界 102 left = backBitmap.getWidth() - overBitmap.getWidth(); 103 } 104 canvas.drawBitmap(overBitmap, left, 0, null); 105 106 }else{//上层图片直接跳到开或关的位置 107 if(state){ 108 //开 109 canvas.drawBitmap(overBitmap, backBitmap.getWidth()-overBitmap.getWidth(), 0, null); 110 }else{ 111 //关 112 canvas.drawBitmap(overBitma