andorid 自定义SwitchButton

来源:互联网 发布:开淘宝店的 编辑:程序博客网 时间:2024/05/21 17:06

因项目缘故需重新定制SwitchButton,效果如下:

 

过程如下:

1.圆角矩形的绘制

2.字体绘制

3.小圆绘制

4.左右滑动动画效果绘制

代码如下:

package com.smart.view;import java.util.Timer;import java.util.TimerTask;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.FontMetrics;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class MySwitchButton extends View{private int w, h;//组件宽高private boolean flag_switch;//开关标志private boolean flag_touch;//触摸标志private String ON = "ON";private String OFF = "OFF";private float textSize = 40;//字体大小private int color1 = 0xff999999;//关背景颜色private int color2 = 0xff3e9edb;//开背景颜色private int color_bg = color1;private int circle_bg_nomal = Color.WHITE;//圆正常情况下的背景private int circle_bg_touch = Color.YELLOW;//触摸时圆的背景//圆心private float y;private float x;private float radius;//圆半径private int distance = 10;//左右边距private OnCircleClickListner mOnCircleClickListner;public MySwitchButton(Context context) {super(context);System.out.println("---MySwitchButton1---");}public MySwitchButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);System.out.println("---MySwitchButton2---");}public MySwitchButton(Context context, AttributeSet attrs) {super(context, attrs);System.out.println("---MySwitchButton3---");}public void setOnCircleClickListner(OnCircleClickListner mOnCircleClickListner){this.mOnCircleClickListner = mOnCircleClickListner;}public boolean isFlag_switch() {return flag_switch;}public void setChecked(boolean flag_switch) {this.flag_switch = flag_switch;if(flag_switch){x = distance+radius;color_bg = color2;}else{x = w-(distance+radius);color_bg = color1;}circleMove();//invalidate();}@Overridepublic boolean onTouchEvent(MotionEvent event) {//float x = event.getX();//float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:flag_touch = true;invalidate();break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:if(mOnCircleClickListner!=null){mOnCircleClickListner.onClick(MySwitchButton.this,!flag_switch);}flag_touch = false;invalidate();break;}return true;}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);this.w = w;this.h = h;y = h/2;radius =  h/2-distance;x = distance+radius;//color_bg = color1;circleMove();//invalidate();System.out.println("-----onSizeChanged----");//System.out.println("x:"+x);//System.out.println("w:"+w);//System.out.println("h:"+h);}@Overrideprotected void onDraw(Canvas canvas) {System.out.println("-----onDraw----");Paint paint = new Paint();paint.setAntiAlias(true);canvas2RoundRect(canvas,paint);//圆角矩形canvas2Text(canvas,paint);//字体canvas2Circle(canvas,paint);//小圆super.onDraw(canvas);}public void canvas2RoundRect(Canvas canvas,Paint paint){paint.setColor(color_bg);RectF oval3 = new RectF(0, 0, w, h);         canvas.drawRoundRect(oval3, 45, 45, paint);}public void canvas2Circle(Canvas canvas,Paint paint){if(flag_touch){paint.setColor(circle_bg_touch);}else{paint.setColor(circle_bg_nomal);}//circleMove();//System.out.println("drawX:"+x);canvas.drawCircle(x, y, radius, paint);}Timer timer; TimerTask task;public void circleMove(){//小圆运动轨迹final float startX =distance+radius; final float endX = w-(distance+radius);final long upDataDistance = 10;if(timer!=null){task.cancel();timer.cancel();timer=null;task=null;}timer = new Timer();task = new TimerTask() {@Overridepublic void run() {if(flag_switch){x+=upDataDistance;//打开}else{x-=upDataDistance;//关闭}if(x>=endX){x=endX;this.cancel();timer.cancel();timer =null;}else if(x<startX){x = startX;this.cancel();timer.cancel();timer =null;}postInvalidate();}};timer.schedule(task, 8, 8);}public void canvas2Text(Canvas canvas,Paint paint){paint.setTextSize(textSize);paint.setColor(Color.WHITE);Rect rect = new Rect();if(flag_switch){paint.getTextBounds(ON, 0, ON.length()-1, rect); int textHight = rect.height();float textWight = paint.measureText(ON);canvas.drawText(ON, (w/2-textWight)/2, (h+textHight)/2, paint);}else{paint.getTextBounds(OFF, 0, OFF.length()-1, rect); float textWight = paint.measureText(OFF);int textHight = rect.height();canvas.drawText(OFF, w/2+(w/2-textWight)/2, (h+textHight)/2, paint);}}public interface OnCircleClickListner{public void onClick(View v,boolean flag);}}
   <com.example.test_myview.MySwitchButton        android:id="@+id/msb"        android:layout_width="70dp"        android:layout_height="27dp"                />

监听接口时要调用public void setChecked(boolean flag_switch)该方法才能使小球左右滑动

1 0