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
- andorid 自定义SwitchButton
- 自定义 SwitchButton
- 自定义SwitchButton
- 仿iOS自定义SwitchButton
- SwitchButton自定义开关
- 自定义滑动开关SwitchButton
- 自定义开关按钮SwitchButton
- 自定义滑动开关-SwitchButton
- 自定义SwitchButton控件
- qml自定义SwitchButton
- 自定义适应低版本switchbutton
- android 自定义开关(SwitchButton)
- Android 自定义SwitchButton开关控件
- 一个简单的自定义SwitchButton
- 自定义滑动开关按钮-SwitchButton
- 自定义的一个SwitchButton控件
- 超级简单的自定义SwitchButton
- switchbutton
- Android手机屏幕px转dp和dp转px工具类
- Dynpro-通过向导创建数据表格
- XCode 模拟器修改为英文版本
- jdk自带常用命令行工具使用
- MyISAM和InnoDB存储引擎的区别
- andorid 自定义SwitchButton
- nodejs——require单次加载
- 新博客安家了!
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
- poj 3696 The Luckiest number 欧拉函数在解a^x=1modm的应用
- 文件上传的三种方式-Java
- hdu 2842(矩阵快速幂+递推)
- 微信公众平台智能回复机器人后台开发
- leetcode Maximum Depth of Binary Tree