超级简单的自定义SwitchButton
来源:互联网 发布:算法 pdf 高清 编辑:程序博客网 时间:2024/06/07 16:05
首先看下我的自定义类
public class SwitchView_Super extends View { private static final int radius = 60; //TODO 中间矩形左上角和右下角的坐标 private int leftTop_X, leftTop_Y, rightBottom_X, rightBottom_Y; //TODO 最右边圆的圆心坐标 private int rightRadius_X; private int rightRadius_Y; private Paint mPaint; //TODO 最上方绘制圆的画笔 private Paint up_Paint; //TODO 判断是否将要向右滑动 private boolean isToRightMove = false; //TODO 判断是否将要向左滑动 private boolean isToLeftMove = false; //TODO 手指按下的X坐标 private float down_X; //TODO 向右滑动距离 private float moveToRight_Instance = 0; //TODO 向左滑动距离 private float moveTOLeft_Instance = 0; //TODO 滑动距离 private float moveInstance = 0; //TODO 向右滑动的状态 private boolean isRight = false; private String state = "最左端"; private String click_state = ""; private String slipfliter = ""; //TODO 定义一张空白的图片 private Bitmap whiteBitmap; //TODO 当前动画执行值 private float currentValue; //TODO 设置滑动渐变 private RadialGradient radialGradient; //TODO 是否是第一次点击左边圆 private boolean isFirst = false; private ValueAnimator valueAnimator_right, valueAnimator_left; private SwitchListener switchListener; public SwitchView_Super(Context context) { super(context); init(); } public SwitchView_Super(Context context, AttributeSet attrs) { super(context, attrs); init(); } public SwitchView_Super(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.parseColor("#bfbfbf")); up_Paint = new Paint(); up_Paint.setAntiAlias(true); up_Paint.setFlags(Paint.ANTI_ALIAS_FLAG); up_Paint.setStyle(Paint.Style.FILL); up_Paint.setColor(Color.parseColor("#ffffff")); currentValue = 1; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //TODO 计算矩形左上角和右下角的坐标 leftTop_X = getMeasuredWidth() / 3; leftTop_Y = getMeasuredHeight() / 2 - radius; rightBottom_Y = getMeasuredHeight() / 2 + radius; //TODO 矩形宽度设置成三倍的圆半径 rightBottom_X = getMeasuredWidth() / 3 + radius * 3; //TODO 计算最右边圆的圆心坐标 rightRadius_X = getMeasuredWidth() / 3 + radius * 3; rightRadius_Y = getMeasuredHeight() / 2; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //TODO 画左边的圆 canvas.drawCircle(leftTop_X, rightRadius_Y, radius, mPaint); //TODO 画中间的矩形// canvas.drawRect(leftTop_X, leftTop_Y, rightBottom_X, rightBottom_Y, mPaint); canvas.drawRect(leftTop_X, rightRadius_Y - radius, leftTop_X + radius * 2, rightRadius_Y + radius, mPaint); //TODO 画出最右边的圆 canvas.drawCircle(leftTop_X + radius * 2, rightRadius_Y, radius, mPaint); //TODO 画出上方移动的圆 canvas.drawCircle(leftTop_X + currentValue, rightRadius_Y, radius - 2, up_Paint); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //TODO 判断点击区域是否在最左侧白色的圆上-->初始位置 if (event.getX() > leftTop_X - radius && event.getX() < leftTop_X + radius && event.getY() > rightRadius_Y - radius && event.getY() < rightRadius_Y + radius) { down_X = event.getX(); isToRightMove = true; isToLeftMove = false; } //TODO 判断点击区域是否在最右侧白色的圆上-->最终位置(选中状态) else if (event.getX() > leftTop_X + radius && event.getX() < rightBottom_X && event.getY() > rightRadius_Y - radius && event.getY() < rightRadius_Y + radius) { down_X = event.getX(); isToLeftMove = true; isToRightMove = false; } break; case MotionEvent.ACTION_UP: //TODO 判断如果是点击右侧 if (event.getX() > leftTop_X + radius && event.getX() < rightBottom_X && event.getY() > rightRadius_Y - radius && event.getY() < rightRadius_Y + radius) { if (currentValue != 120.0) { doAnimation_Right(); switchListener.open(); isFirst = true; } } else if (event.getX() > leftTop_X - radius && event.getX() < leftTop_X + radius && event.getY() > rightRadius_Y - radius && event.getY() < rightRadius_Y + radius) { if (isFirst) { if (currentValue != -0.0) { doAnimation_Left(); switchListener.close(); } } } isToLeftMove = false; isToRightMove = false; break; } postInvalidate(); return true; } //TODO 设置点击开关按钮右侧的动画 private void doAnimation_Right() { valueAnimator_right = ValueAnimator.ofFloat(moveInstance, radius * 2); valueAnimator_right.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { currentValue = (float) animation.getAnimatedValue(); postInvalidate(); } }); //TODO 当滑块到最右端的时候改变背景颜色 valueAnimator_right.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mPaint.setColor(Color.RED); postInvalidate(); } }); valueAnimator_right.setDuration(800); valueAnimator_right.setInterpolator(new AccelerateDecelerateInterpolator()); valueAnimator_right.start(); } //TODO 设置点击开关按钮左侧的动画 private void doAnimation_Left() { valueAnimator_left = ValueAnimator.ofFloat(2 * radius + moveInstance, 0); valueAnimator_left.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { currentValue = (float) animation.getAnimatedValue(); postInvalidate(); } }); //TODO 当滑块到最左端的时候改变背景颜色 valueAnimator_left.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mPaint.setColor(Color.GRAY); postInvalidate(); } }); valueAnimator_left.setDuration(500); valueAnimator_left.setInterpolator(new AccelerateDecelerateInterpolator()); valueAnimator_left.start(); } public interface SwitchListener { void close(); void open(); } public void setSwitchListener(SwitchListener switchListener) { this.switchListener = switchListener; }}然后在我们的Activity中引用
public class SwitchMainActivity extends Activity { private SwitchView_Super switchButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_switchview); switchButton= (SwitchView_Super) this.findViewById(R.id.swithcButton); switchButton.setSwitchListener(new SwitchView_Super.SwitchListener() { public void close() { Toast.makeText(SwitchMainActivity.this,"关闭",Toast.LENGTH_SHORT).show(); } @Override public void open() { Toast.makeText(SwitchMainActivity.this,"开启",Toast.LENGTH_SHORT).show(); } }); }}
欢迎大家到交流群里面分享一些惊天地泣鬼神的代码,或者编程思想,贴下,Android代码艺术:128672634,如果你不仅仅是把安卓当作一份工作,而是包含坚持和热爱!
阅读全文
2 0
- 超级简单的自定义SwitchButton
- 超级简单的自定义SwitchButton二
- 一个简单的自定义SwitchButton
- 自定义的一个SwitchButton控件
- 自定义 SwitchButton
- 自定义SwitchButton
- andorid 自定义SwitchButton
- 仿iOS自定义SwitchButton
- SwitchButton自定义开关
- 自定义滑动开关SwitchButton
- 自定义开关按钮SwitchButton
- 自定义滑动开关-SwitchButton
- 自定义SwitchButton控件
- qml自定义SwitchButton
- 自定义的一个仿ios开关效果的SwitchButton
- Android自定义的SwitchButton按钮,自己喜欢的风格
- 自定义适应低版本switchbutton
- android 自定义开关(SwitchButton)
- 51nod 1068 Bash游戏 V3
- 获取ResultSet的行数和列数
- 【NOIP2016】【合并线段树】D1T2 天天爱跑步 题解
- Java8 Lambda表达式学习
- [JavaEE] Maven 开发Spring Web 项目的目录结构
- 超级简单的自定义SwitchButton
- InnoDB还是MyISAM 再谈MySQL存储引擎的选择
- 如何做到优化引擎搜索SEO之第四篇:谷歌分析(Google Analytics)
- java-DAO模式实现数据库增,删,改,查和传统模式实现数据库增,删,改,查对比-JDBC
- 海量数据存储管理
- getline()详解
- canvas插入图片和画文字
- [kuangbin带你飞]专题十二 基础dp1
- SDUT 3919 Special Judge Ⅰ