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
  • 18964

Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题

之前写过关于HorizontalScrollView滑动和按钮事件触发问题,但是不能所有的情况,最近几天一直在想这个问题,今天有一个比较好的解决思路,最终应用在项目里面效果也很好,首先说明一下功能: ...

UITableViewCell左滑动删除 和cell上按钮的点击事件

// //  ViewController.m //  UITableViewCell左滑动删除 // //  Created by XKDX.NET on 16/4/13. ...
  • iOSbird
  • iOSbird
  • 2016年04月15日 19:33
  • 4724

AndroidStudio Toolbar 滑动隐藏以及返回按钮点击事件

AndroidStudio Toolbar 滑动隐藏以及返回按钮点击事件 标签: android 2016-06-15 17:55 4669人阅读 评论(0) 收藏 举报  ...

Android事件分发机制与滑动冲突

  • 2016年08月12日 20:03
  • 20.56MB
  • 下载

Jquery中的事件处理(自动触发事件,禁用按钮,悬停,失焦,滑动效果)

1.自动触发事件 .Red { color:Red; } .Green { color:Green; ...
  • ws_hgo
  • ws_hgo
  • 2011年07月26日 17:50
  • 16071

android滑动事件冲突の外部拦截法

  • 2016年08月23日 15:15
  • 527KB
  • 下载

Android 仿ios 可滑动切换效果按钮 实例代码

我们经常可以在ios上看到许多炫彩华丽的可拖动切换的Switch 按钮,前几天看了一篇博客写的是仿蘑菇街可滑动切 换的按钮,然后就按着那篇博客作者的思路亲自试验了一次,然后查阅了相关的资料,在这里跟大...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android滑动按钮事件
举报原因:
原因补充:

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