今天纪录一下滑动按钮功能。。

首先效果图:


然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.class

main.class

[c-sharp:nogutter] view plain copy print ?
  1. importandroid.app.Activity;
  2. importandroid.os.Bundle;
  3. importandroid.widget.Toast;
  4. publicclassMainextendsActivityimplementsOnChangedListener{
  5. /**Calledwhentheactivityisfirstcreated.*/
  6. @Override
  7. publicvoidonCreate(BundlesavedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. SlipButtonmyBtn=(SlipButton)findViewById(R.id.slipBtn);//获得指定控件
  11. myBtn.SetOnChangedListener(this);//为控件设置监听器
  12. }
  13. @Override
  14. publicvoidOnChanged(booleanCheckState){//当按钮状态被改变时
  15. //TODOAuto-generatedmethodstub
  16. if(CheckState)
  17. Toast.makeText(this,"打开了...",Toast.LENGTH_SHORT).show();
  18. else
  19. Toast.makeText(this,"关闭了...",Toast.LENGTH_SHORT).show();
  20. }
  21. }
import android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class Main extends Activity implements OnChangedListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);//获得指定控件 myBtn.SetOnChangedListener(this);//为控件设置监听器 } @Override public void OnChanged(boolean CheckState) {//当按钮状态被改变时 // TODO Auto-generated method stub if(CheckState) Toast.makeText(this,"打开了..." , Toast.LENGTH_SHORT).show(); else Toast.makeText(this,"关闭了..." , Toast.LENGTH_SHORT).show(); } }

SlipButton.class

[c-sharp] view plain copy print ?
  1. importandroid.content.Context;
  2. importandroid.graphics.Bitmap;
  3. importandroid.graphics.BitmapFactory;
  4. importandroid.graphics.Canvas;
  5. importandroid.graphics.Matrix;
  6. importandroid.graphics.Paint;
  7. importandroid.graphics.Rect;
  8. importandroid.util.AttributeSet;
  9. importandroid.view.MotionEvent;
  10. importandroid.view.View;
  11. importandroid.view.View.OnTouchListener;
  12. publicclassSlipButtonextendsViewimplementsOnTouchListener{
  13. privatebooleanNowChoose=false;//记录当前按钮是否打开,true为打开,flase为关闭
  14. privatebooleanOnSlip=false;//记录用户是否在滑动的变量
  15. privatefloatDownX,NowX;//按下时的x,当前的x,
  16. privateRectBtn_On,Btn_Off;//打开和关闭状态下,游标的Rect
  17. privatebooleanisChgLsnOn=false;
  18. privateOnChangedListenerChgLsn;
  19. privateBitmapbg_on,bg_off,slip_btn;
  20. publicSlipButton(Contextcontext){
  21. super(context);
  22. //TODOAuto-generatedconstructorstub
  23. init();
  24. }
  25. publicSlipButton(Contextcontext,AttributeSetattrs){
  26. super(context,attrs);
  27. //TODOAuto-generatedconstructorstub
  28. init();
  29. }
  30. privatevoidinit(){//初始化
  31. //载入图片资源
  32. bg_on=BitmapFactory.decodeResource(getResources(),R.drawable.slip_bg_on);
  33. bg_off=BitmapFactory.decodeResource(getResources(),R.drawable.slip_bg_off);
  34. slip_btn=BitmapFactory.decodeResource(getResources(),R.drawable.slip_btn);
  35. //获得需要的Rect数据
  36. Btn_On=newRect(0,0,slip_btn.getWidth(),slip_btn.getHeight());
  37. Btn_Off=newRect(
  38. bg_off.getWidth()-slip_btn.getWidth(),
  39. 0,
  40. bg_off.getWidth(),
  41. slip_btn.getHeight());
  42. setOnTouchListener(this);//设置监听器,也可以直接复写OnTouchEvent
  43. }
  44. @Override
  45. protectedvoidonDraw(Canvascanvas){//绘图函数
  46. //TODOAuto-generatedmethodstub
  47. super.onDraw(canvas);
  48. Matrixmatrix=newMatrix();
  49. Paintpaint=newPaint();
  50. floatx;
  51. {
  52. if(NowX<(bg_on.getWidth()/2))//滑动到前半段与后半段的背景不同,在此做判断
  53. canvas.drawBitmap(bg_off,matrix,paint);//画出关闭时的背景
  54. else
  55. canvas.drawBitmap(bg_on,matrix,paint);//画出打开时的背景
  56. if(OnSlip)//是否是在滑动状态,
  57. {
  58. if(NowX>=bg_on.getWidth())//是否划出指定范围,不能让游标跑到外头,必须做这个判断
  59. x=bg_on.getWidth()-slip_btn.getWidth()/2;//减去游标1/2的长度...
  60. else
  61. x=NowX-slip_btn.getWidth()/2;
  62. }else{//非滑动状态
  63. if(NowChoose)//根据现在的开关状态设置画游标的位置
  64. x=Btn_Off.left;
  65. else
  66. x=Btn_On.left;
  67. }
  68. if(x<0)//对游标位置进行异常判断...
  69. x=0;
  70. elseif(x>bg_on.getWidth()-slip_btn.getWidth())
  71. x=bg_on.getWidth()-slip_btn.getWidth();
  72. canvas.drawBitmap(slip_btn,x,0,paint);//画出游标.
  73. }
  74. }
  75. @Override
  76. publicbooleanonTouch(Viewv,MotionEventevent){
  77. //TODOAuto-generatedmethodstub
  78. switch(event.getAction())//根据动作来执行代码
  79. {
  80. caseMotionEvent.ACTION_MOVE://滑动
  81. NowX=event.getX();
  82. break;
  83. caseMotionEvent.ACTION_DOWN://按下
  84. if(event.getX()>bg_on.getWidth()||event.getY()>bg_on.getHeight())
  85. returnfalse;
  86. OnSlip=true;
  87. DownX=event.getX();
  88. NowX=DownX;
  89. break;
  90. caseMotionEvent.ACTION_UP://松开
  91. OnSlip=false;
  92. booleanLastChoose=NowChoose;
  93. if(event.getX()>=(bg_on.getWidth()/2))
  94. NowChoose=true;
  95. else
  96. NowChoose=false;
  97. if(isChgLsnOn&&(LastChoose!=NowChoose))//如果设置了监听器,就调用其方法..
  98. ChgLsn.OnChanged(NowChoose);
  99. break;
  100. default:
  101. }
  102. invalidate();//重画控件
  103. returntrue;
  104. }
  105. publicvoidSetOnChangedListener(OnChangedListenerl){//设置监听器,当状态修改的时候
  106. isChgLsnOn=true;
  107. ChgLsn=l;
  108. }
  109. }
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; public class SlipButton extends View implements OnTouchListener{ private boolean NowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭 private boolean OnSlip = false;//记录用户是否在滑动的变量 private float DownX,NowX;//按下时的x,当前的x, private Rect Btn_On,Btn_Off;//打开和关闭状态下,游标的Rect private boolean isChgLsnOn = false; private OnChangedListener ChgLsn; private Bitmap bg_on,bg_off,slip_btn; public SlipButton(Context context) { super(context); // TODO Auto-generated constructor stub init(); } public SlipButton(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(); } private void init(){//初始化 //载入图片资源 bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_on); bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_off); slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.slip_btn); //获得需要的Rect数据 Btn_On = new Rect(0,0,slip_btn.getWidth(),slip_btn.getHeight()); Btn_Off = new Rect( bg_off.getWidth()-slip_btn.getWidth(), 0, bg_off.getWidth(), slip_btn.getHeight()); setOnTouchListener(this);//设置监听器,也可以直接复写OnTouchEvent } @Override protected void onDraw(Canvas canvas) {//绘图函数 // TODO Auto-generated method stub super.onDraw(canvas); Matrix matrix = new Matrix(); Paint paint = new Paint(); float x; { if(NowX<(bg_on.getWidth()/2))//滑动到前半段与后半段的背景不同,在此做判断 canvas.drawBitmap(bg_off,matrix, paint);//画出关闭时的背景 else canvas.drawBitmap(bg_on,matrix, paint);//画出打开时的背景 if(OnSlip)//是否是在滑动状态, { if(NowX >= bg_on.getWidth())//是否划出指定范围,不能让游标跑到外头,必须做这个判断 x = bg_on.getWidth()-slip_btn.getWidth()/2;//减去游标1/2的长度... else x = NowX - slip_btn.getWidth()/2; }else{//非滑动状态 if(NowChoose)//根据现在的开关状态设置画游标的位置 x = Btn_Off.left; else x = Btn_On.left; } if(x<0)//对游标位置进行异常判断... x = 0; else if(x>bg_on.getWidth()-slip_btn.getWidth()) x = bg_on.getWidth()-slip_btn.getWidth(); canvas.drawBitmap(slip_btn,x, 0, paint);//画出游标. } } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch(event.getAction())//根据动作来执行代码 { case MotionEvent.ACTION_MOVE://滑动 NowX = event.getX(); break; case MotionEvent.ACTION_DOWN://按下 if(event.getX()>bg_on.getWidth()||event.getY()>bg_on.getHeight()) return false; OnSlip = true; DownX = event.getX(); NowX = DownX; break; case MotionEvent.ACTION_UP://松开 OnSlip = false; boolean LastChoose = NowChoose; if(event.getX()>=(bg_on.getWidth()/2)) NowChoose = true; else NowChoose = false; if(isChgLsnOn&&(LastChoose!=NowChoose))//如果设置了监听器,就调用其方法.. ChgLsn.OnChanged(NowChoose); break; default: } invalidate();//重画控件 return true; } public void SetOnChangedListener(OnChangedListener l){//设置监听器,当状态修改的时候 isChgLsnOn = true; ChgLsn = l; } }

onchangeListener.class

[c-sharp] view plain copy print ?
  1. packageCMD100.demo.slipButton;
  2. publicinterfaceOnChangedListener{
  3. abstractvoidOnChanged(booleanCheckState);
  4. }
package CMD100.demo.slipButton; public interface OnChangedListener { abstract void OnChanged(boolean CheckState); }

main.xml代码

[c-sharp] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/hello"
  11. />
  12. <LinearLayout
  13. android:orientation="horizontal"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:background="#ff0000"
  17. >
  18. <TextView
  19. android:text="测试:"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. />
  23. <CMD100.demo.slipButton.SlipButton
  24. android:id="@+id/slipBtn"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:layout_marginLeft="10sp"
  28. />
  29. </LinearLayout>
  30. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <LinearLayout android:orientation = "horizontal" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:background = "#ff0000" > <TextView android:text = "测试:" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <CMD100.demo.slipButton.SlipButton android:id = "@+id/slipBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft = "10sp" /> </LinearLayout> </LinearLayout>

注意:在xml里头要放置的位置

<[包名].SlipButton
android:id = "@+id/slipBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

然后可以像其他控件一样使用了...

SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);
myBtn.SetOnChangedListener(...);

代码到这里就全部完成了。

原创作者是:zcmmwbd

更多相关文章

  1. Android(安卓)keep screen on 方法
  2. Android关于全屏设置和隐藏状态栏、沉浸式状态栏的总结
  3. 使用TelephonyManager类获取手机状态
  4. Android(安卓)去掉标题栏,状态栏,导航栏
  5. android 判断APP是否打开的方法
  6. Android架构组件-LiveData
  7. android 中的activity管理
  8. Button 有按下效果
  9. android访问权限(Android(安卓)permission )大全

随机推荐

  1. android —— 自定义控件 最简单下拉刷新
  2. Android(安卓)自带的图片资源调用
  3. Android基本概念
  4. Android(安卓)4.0 SDK官方下载
  5. Android(安卓)强制横屏
  6. Android百度地图相关内容汇总
  7. android textview内容超长滚动视图
  8. android:windowSoftInputMode属性详解
  9. Android(安卓)- Android实现定时器的方法
  10. android优秀网站收集中