android自定义滑动开关控件,适合所有的android系统

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

我们都知道Android4.0以上才带有滑动开关Switch,那么在4.0以下呢,很多人会选择用CheckBox,放两张图片,但是这样子只能点击,效果不太好,所以我就自定义了滑动开关WiperSwitch这么一个控件,下面先把截图贴上吧,这蹩脚的图片真戳啊,大家可以自己换三张图片

package com.example.wiperswitch;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.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;/** *  * @author xiaanming * */public class WiperSwitch extends View implements OnTouchListenerprivate Bitmap bg_on, bg_off, slipper_btn; /**  * 按下时的x和当前的x  */ private float downX, nowX;  /**  * 记录用户是否在滑动  */ private boolean onSlip = false;  /**  * 当前的状态  */ private boolean nowStatus = false;  /**  * 监听接口  */ private OnChangedListener listener;   public WiperSwitch(Context context) {  super(context);  init(); } public WiperSwitch(Context context, AttributeSet attrs) {  super(context, attrs);  init(); }  public void init(){  //载入图片资源  bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.on_btn);  bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.off_btn);  slipper_btn = BitmapFactory.decodeResource(getResources(), R.drawable.white_btn);    setOnTouchListener(this); }  protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  Matrix matrix = new Matrix();  Paint paint = new Paint();  float x = 0;    //根据nowX设置背景,开或者关状态  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() - slipper_btn.getWidth()/2;//减去滑块1/2的长度   else    x = nowX - slipper_btn.getWidth()/2;  }else {   if(nowStatus){//根据当前的状态设置滑块的x值    x = bg_on.getWidth() - slipper_btn.getWidth();   }else{    x = 0;   }  }    //对滑块滑动进行异常处理,不能让滑块出界  if (x < 0 ){   x = 0;  }  else if(x > bg_on.getWidth() - slipper_btn.getWidth()){   x = bg_on.getWidth() - slipper_btn.getWidth();  }    //画出滑块  canvas.drawBitmap(slipper_btn, x , 0, paint);  } @Override public boolean onTouch(View v, MotionEvent event) {  switch(event.getAction()){  case MotionEvent.ACTION_DOWN:{   if (event.getX() > bg_off.getWidth() || event.getY() > bg_off.getHeight()){    return false;   }else{    onSlip = true;    downX = event.getX();    nowX = downX;   }   break;  }  case MotionEvent.ACTION_MOVE:{   nowX = event.getX();   break;  }  case MotionEvent.ACTION_UP:{   onSlip = false;   if(event.getX() >= (bg_on.getWidth()/2)){    nowStatus = true;    nowX = bg_on.getWidth() - slipper_btn.getWidth();   }else{    nowStatus = false;    nowX = 0;   }      if(listener != null){    listener.OnChanged(WiperSwitch.this, nowStatus);   }   break;  }  }  //刷新界面  invalidate();  return true; }    /**  * 为WiperSwitch设置一个监听,供外部调用的方法  * @param listener  */ public void setOnChangedListener(OnChangedListener listener){  this.listener = listener; }   /**  * 设置滑动开关的初始状态,供外部调用  * @param checked  */ public void setChecked(boolean checked){  if(checked){   nowX = bg_off.getWidth();  }else{   nowX = 0;  }  nowStatus = checked; }     /**     * 回调接口     * @author len     *     */ public interface OnChangedListener {  public void OnChanged(WiperSwitch wiperSwitch, boolean checkState); }}


用法是,先定义XML文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <com.example.wiperswitch.WiperSwitch        android:id="@+id/wiperSwitch1"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>


新建一个Activity

package com.example.wiperswitch;import android.app.Activity;import android.os.Bundle;import android.util.Log;import com.example.wiperswitch.WiperSwitch.OnChangedListener;public class MainActivity extends Activity implements OnChangedListener @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  //实例化WiperSwitch  WiperSwitch wiperSwitch = (WiperSwitch)findViewById(R.id.wiperSwitch1);    //设置初始状态为false  wiperSwitch.setChecked(false);    //设置监听  wiperSwitch.setOnChangedListener(this); } @Override public void OnChanged(WiperSwitch wiperSwitch, boolean checkState) {  Log.e("log", "" + checkState); }}

代码全部上完了,写的不好的地方欢迎大牛指点!

哦,忘记了还有三张蹩脚的图片没传

 

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值