android滑动按钮事件

转载 2012年03月23日 00:21:40

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

首先效果图:


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

main.class

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

SlipButton.class

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

 

 onchangeListener.class

  1. package CMD100.demo.slipButton;  
  2.   
  3. public interface OnChangedListener {  
  4.     abstract void OnChanged(boolean CheckState);  
  5. }  

main.xml代码

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns: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.       
  30. </LinearLayout>  
  31. </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

android滑动按钮事件

 今天纪录一下滑动按钮功能。。首先效果图:然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.classmain...
  • luoyuhhy
  • luoyuhhy
  • 2011年06月16日 16:34
  • 19204

【Android】滑动确认的按钮

需求:部分场景下,防止用户误操作触发按钮,通过滑动的方式完成用户的点击事件。 自定义组件实现思路: 1、定义一View组件,该组件可以通过手势拖动在其父类组件上滑动。 2、定义一ViewGrou...
  • lyz00107
  • lyz00107
  • 2017年02月13日 17:03
  • 442

Android实现类似ios滑动按钮

没吃过猪肉,但也一定见过猪跑喽。IOS的滑动按钮菜单在UI设计里面绝对堪称一绝,在学习了Android的自定义view后,我萌生了模仿它的想法。 实现上面的模拟需要自定义一个View;      ...
  • ZQL2288
  • ZQL2288
  • 2017年04月28日 21:05
  • 689

Android 开发之 ToggleButton App 滑动开关按钮

现在很多项目都有推送这一块的功能,而用户不一定想看到这些推送,这时候开关按钮就是必须的了,让用户自己设置通知管理。android开发中我也自己写过一个自定义的view,虽然实现了效果不过感觉有点(动画...
  • AnalyzeSystem
  • AnalyzeSystem
  • 2015年07月16日 12:59
  • 4355

android滑动开关按钮

1、  http://blog.csdn.net/lwj704684897/article/details/12946531
  • mcy478643968
  • mcy478643968
  • 2014年05月20日 11:37
  • 6071

Android View深入学习——实现QQ滑动显示隐藏按钮ListView

学Android也有一段时间了,一直都是用开源的控件,没有自己写过自定义的控件。最近在复习View的一些知识,感觉还是上手写点代码比较实在。在写自定义View之前大概要了解以下知识 View的测...
  • u014761700
  • u014761700
  • 2016年07月24日 20:43
  • 852

安卓自定义控件之可以滑动吸附的button按钮

安卓自定义控件之可以滑动吸附的button按钮
  • cmwly
  • cmwly
  • 2016年09月27日 18:03
  • 1483

Android仿微信ListView滑动出现Delete按钮--优化版

Android仿微信ListView滑动出现Delete按钮,在网上搜到一个例子(原作者博客没找到,抱歉),效果图是这样的,相信很多人用过, 在结合自己项目使用过程中,发现一些问题,例如滑动时经常...
  • u010057266
  • u010057266
  • 2015年04月01日 20:22
  • 1160

Android自定义SwitchButton左右滑动开关按钮控件

转载自:点击打开链接 以前在项目中做过一个类似滑动开关的、但是可惜的是只能用点的方式去操作、总感觉不完美、在网上查阅资料后、稍稍的改进了一下、添加了滑动事件、封装了一个 SwitchButton...
  • qq_15096707
  • qq_15096707
  • 2015年07月04日 21:17
  • 1164

Android开发自定义View之滑动按钮与自定义属性

谈到自定义View,我们都知道Android系统原生内置不少的View控件,常用的有: 文本控件TextView和EditText,图片控件ImageView,按钮控件 Button和 ImageB...
  • finddreams
  • finddreams
  • 2014年10月23日 10:40
  • 2276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android滑动按钮事件
举报原因:
原因补充:

(最多只允许输入30个字)