Android 自定义仿微信开关按钮
来源:互联网 发布:免费网上审批软件 编辑:程序博客网 时间:2024/06/04 19:45
1.按钮可以点击打开和滑动打开
先上图:
2.思路很简单:
2.1绘制左边圆、矩形然后右边圆
2.2绘制中间滑动的白色小圆
2.3拦截触摸事件,判断点击,和滑动事件,同时重绘小圆和背景
3.上代码
package com.ouyang.qqui.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Handler;import android.os.Message;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * Create by oy 2017/9/8 9:45. * 仿微信按钮 */public class MyClickButton extends View { //左圆半径 private int center; //矩形x坐标 private int rec_x; //画笔 private Paint paint; //控件宽 private int measuredWidth; //控件高 private int measuredHeight; //小圆半径 private int smallCenter; //小圆的x坐标 private float smallCenter_x; //小圆画笔 private Paint smallPaint; //按下的x坐标 private float startx; //移动的结束坐标 private float endx; //左圆圆心和右圆圆心中间的坐标 private int mid_x; public MyClickButton(Context context) { this(context, null); } public MyClickButton(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public MyClickButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } //回调,点击事件 private OnMClickListener onClickListener; public void setOnMbClickListener(OnMClickListener onClickListener) { this.onClickListener = onClickListener; } public interface OnMClickListener { void onClick(boolean isRight); } private void init() { //初始化一些数据 paint = new Paint(Paint.ANTI_ALIAS_FLAG); smallPaint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.GREEN); smallPaint.setColor(Color.WHITE); } //往左 public static final int TO_LEFT = 11; //往右 public static final int TO_RIGHT = 22; private boolean isRight = true; private boolean isAnimate = false; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case TO_LEFT: paint.setColor(Color.GRAY); if (smallCenter_x > center) { smallCenter_x -= 5; handler.sendEmptyMessageDelayed(TO_LEFT, 1); isAnimate = true; } else { smallCenter_x = center; //设置滑动不可点击 setEnabled(true); isAnimate = false; } break; case TO_RIGHT: paint.setColor(Color.GREEN); if (smallCenter_x < rec_x) { smallCenter_x += 5; handler.sendEmptyMessageDelayed(TO_RIGHT, 1); isAnimate = true; } else { smallCenter_x = rec_x; setEnabled(true); isAnimate = false; } break; } //重绘 invalidate(); } }; @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measuredHeight = getMeasuredHeight(); measuredWidth = getMeasuredWidth(); //得出左圆,长方形,右圆的坐标 center = measuredHeight / 2; //长方形右边的坐标 rec_x = measuredWidth - center; //小圆的半径 = 大圆半径减5 smallCenter = center - 5; //小圆的圆心x坐标一直在变化 smallCenter_x = rec_x; } @Override protected void onDraw(Canvas canvas) { //左圆 canvas.drawCircle(center, center, center, paint); //矩形 canvas.drawRect(center, 0, rec_x, measuredHeight, paint); //右圆 canvas.drawCircle(rec_x, center, center, paint); //小圆 canvas.drawCircle(smallCenter_x, center, smallCenter, smallPaint); super.onDraw(canvas); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //开始的x坐标 startx = event.getX(); endx = event.getX(); break; case MotionEvent.ACTION_MOVE: float distance = event.getX() - endx; smallCenter_x += distance; //控制范围 if (smallCenter_x > rec_x) { isRight = true; smallCenter_x = rec_x; paint.setColor(Color.GREEN); } else if (smallCenter_x < center) { //最左 smallCenter_x = center; isRight = false; paint.setColor(Color.GRAY); } invalidate(); break; case MotionEvent.ACTION_UP: //分2种情况,1.点击 2.没滑过中点 //1.点击 float up_x = event.getX(); //按下和抬起的距离小于2确定是点击了 if (Math.abs(up_x - Math.abs(startx)) < 2) { //不在动画的时候可以点击 if (!isAnimate) { startGO(); } } else { //2.没滑过中点 //滑到中间的x坐标 mid_x = (center + (rec_x - center) / 2); if (smallCenter_x < mid_x) { //最左 isRight = false; smallCenter_x = center; paint.setColor(Color.GRAY); setEnabled(true); invalidate(); } else { //最右 isRight = true; smallCenter_x = rec_x; paint.setColor(Color.GREEN); setEnabled(true); invalidate(); } } //到了两端都有点击事件 if (smallCenter_x == rec_x || smallCenter_x == center) { if (onClickListener != null) { onClickListener.onClick(isRight); } } break; } return true; } //提供方法调用 private void goLeft() { isRight = false; handler.sendEmptyMessageDelayed(TO_LEFT, 40); } private void goRight() { isRight = true; handler.sendEmptyMessageDelayed(TO_RIGHT, 40); } public void startGO() { if (isRight) { goLeft(); } else { goRight(); } }}
代码中调用:
mbButton.setOnMbClickListener(new MyClickButton.OnMClickListener() { @Override public void onClick(boolean isRight) { if (isRight){ Toast.makeText(weixinButtonActivity.this,"右",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(weixinButtonActivity.this,"左",Toast.LENGTH_SHORT).show(); } } });
4.完事了
阅读全文
2 0
- Android 自定义仿微信开关按钮
- Android自定义开关按钮
- android 自定义开关按钮
- Android自定义开关按钮
- android 自定义开关按钮
- android自定义开关、图片按钮
- Android 中的自定义开关按钮
- Android 自定义绘制开关按钮
- Android自定义View之自定义开关按钮
- Android 自定义实现switch开关按钮
- android 自定义竖开关按钮 SwitchButton
- Android 自定义实现switch开关按钮
- Android 自定义实现switch开关按钮
- Android 自定义实现switch开关按钮
- Android 自定义实现switch开关按钮
- android开发笔记之自定义开关按钮
- Android自定义View实现开关按钮
- Android 自定义实现switch开关按钮
- 基于nginx+jwplayer的点播服务器(测试成功)
- 欢迎使用CSDN-markdown编辑器
- 计算机网络
- 未能加载调试符号 的一个可能原因
- 使用surpsuite进行爆破
- Android 自定义仿微信开关按钮
- 第三周项目2
- C++设计模式之观察者模式
- Eclipse搭建EasyUI环境
- 16、Js-图片轮播与切换(圆点&箭头)
- jsp Property XXX not found on type XXX 字段存在 仍然报错
- 爬虫-02-Http代理(抓包神器)
- 完整的直播+点播全端解决方案
- Elasticsearch5.6.0安装及添加head插件