http://www.apkbus.com/forum.php?mod=viewthread&tid=55593

先看一下效果图:
.

  1. public class SlipButton extends View {
  2. private boolean nowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭
  3. private boolean onSlip = false;//记录用户是否在滑动的变量
  4. private float nowX;//按下时的x,当前的x
  5. private float downX;
  6. private float baseX;
  7. private OnChangedListener ChgLsn;
  8. private Bitmap slip_btn;
  9. private float centerX;
  10. private float yes_text_width;
  11. private float no_text_width;
  12. private int btnWdith;
  13. private String[] messages;
  14. private Paint paint;
  15. public SlipButton(Context context) {
  16. super(context);
  17. init();
  18. }
  19. public SlipButton(Context context, AttributeSet attrs) {
  20. super(context, attrs);
  21. init();
  22. }
  23. private void init() {
  24. paint = new Paint();
  25. paint.setAntiAlias(true);
  26. paint.setColor(Color.BLACK);
  27. paint.setTextSize(14);
  28. setMessages(new String[]{"Yes", "No"});
  29. }
  30. public void setButtonBitmap(Bitmap bitmap) {
  31. if (bitmap == null) {
  32. return;
  33. }
  34. slip_btn = bitmap;
  35. btnWdith = slip_btn.getWidth() / 3;
  36. centerX = btnWdith / 2;
  37. }
  38. public void setTextColor(int color) {
  39. paint.setColor(color);
  40. }
  41. public void setTextSize(int size) {
  42. paint.setTextSize(size);
  43. }
  44. public void setMessages(String[] messages) {
  45. this.messages = messages;
  46. yes_text_width = paint.measureText(messages[0]);
  47. no_text_width = paint.measureText(messages[1]);
  48. }
  49. public void setStatusOn(boolean on) {
  50. nowChoose = on;
  51. }
  52. public boolean getStatusOn() {
  53. return nowChoose;
  54. }
  55. public void setOnChangedListener(OnChangedListener l) {
  56. ChgLsn = l;
  57. }
  58. @Override
  59. protected void onDraw(Canvas canvas) {
  60. super.onDraw(canvas);
  61. if (slip_btn == null) {
  62. return;
  63. }
  64. float minX = centerX;
  65. float maxX = getMeasuredWidth() - centerX;
  66. if (onSlip) {
  67. nowX = baseX - (downX - nowX);
  68. nowX = Math.min(Math.max(minX, nowX), maxX);
  69. } else {
  70. if (nowChoose) {
  71. nowX = maxX;
  72. } else {
  73. nowX = minX;
  74. }
  75. baseX = nowX;
  76. }
  77. canvas.drawBitmap(slip_btn, nowX - centerX - btnWdith, 0, paint);//画出游标.
  78. int marginX1 = (int)(btnWdith - yes_text_width) / 2;
  79. canvas.drawText(messages[0], nowX - centerX - marginX1 - yes_text_width, 22, paint);
  80. int marginX2 = (int)(btnWdith - no_text_width) / 2;
  81. canvas.drawText(messages[1], nowX + centerX + marginX2, 22, paint);
  82. }
  83. @Override
  84. public boolean onTouchEvent(MotionEvent event) {
  85. if (slip_btn == null) {
  86. return false;
  87. }
  88. switch(event.getAction())//根据动作来执行代码
  89. {
  90. case MotionEvent.ACTION_MOVE://滑动
  91. nowX = event.getX();
  92. float moveX = downX - nowX;
  93. if (Math.abs(moveX) > 5) {
  94. onSlip = true;
  95. }
  96. break;
  97. case MotionEvent.ACTION_DOWN://按下
  98. downX = event.getX();
  99. break;
  100. case MotionEvent.ACTION_UP://松开
  101. boolean LastChoose = nowChoose;
  102. if (onSlip) {
  103. moveX = downX - event.getX();
  104. if (nowChoose) {
  105. if ((moveX > 0) && (moveX >= centerX))
  106. nowChoose = !nowChoose;
  107. } else {
  108. if ((moveX < 0) && (Math.abs(moveX) >= centerX))
  109. nowChoose = !nowChoose;
  110. }
  111. } else {
  112. nowChoose = !nowChoose;
  113. }
  114. onSlip = false;
  115. if ((ChgLsn != null) && (LastChoose != nowChoose)) {
  116. if (nowChoose) {
  117. ChgLsn.onChanged(nowChoose, messages[0]);
  118. } else {
  119. ChgLsn.onChanged(nowChoose, messages[1]);
  120. }
  121. }
  122. break;
  123. default:
  124. break;
  125. }
  126. invalidate();//重画控件
  127. return true;
  128. }
  129. public interface OnChangedListener {
  130. public void onChanged(boolean on, String value);
  131. }
  132. }
复制代码

更多相关文章

  1. Android(安卓)CDMA分支
  2. Android中的Animation使用
  3. LitePal框架上手小记录
  4. Android(安卓)首选网络模式默认值的修改方法
  5. Android(安卓)Studio 快捷键(转)
  6. 【Android】开源项目汇总
  7. dji msdk开发 sample测试与osdk通信
  8. Android多方案实现定时器功能
  9. Android如何使用注解进行代码检查

随机推荐

  1. 为x86进行android NDK程序开发要注意的问
  2. 如何将uboot里面的参数传给recovery或ker
  3. 网络传输数据解析(SAX)
  4. Android(安卓)把个Excel 搞成sqlite数据
  5. Android以太网框架情景分析之启动简介
  6. android学习——windows 类详细介绍
  7. 重磅来袭!2020 年需要关注的 5 大 Android
  8. Android(安卓)自动点击
  9. 传智播客--ContentProvider共享数据和Con
  10. (转)Android中Dialog的“生命周期”