android自定义滑动开关控件,适合所有的android系统
我们都知道Android4.0以上才带有滑动开关Switch,那么在4.0以下呢,很多人会选择用CheckBox,放两张图片,但是这样子只能点击,效果不太好,所以我就自定义了滑动开关WiperSwitch这么一个控件,下面先把截图贴上吧,这蹩脚的图片真戳啊,大家可以自己换三张图片[java] view plaincopypackage 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 OnTouchListener{ private 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(WiperSwitc h.this, nowStatus); }
break; } } //刷新界面invalidate(); return true; }
/** * 为WiperSwitch设置一个监听,供外部调用的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
* @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文件[html] view
plaincopy
新建一个Activity[java] view plaincopypackage
com.example.wiperswitch; import
android.app.Activity; import android.os.Bundle; import android.util.Log; import
com.example.wiperswitch.WiperSwitch.OnChangedListen er; 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); } } 代码全部上完了,写的不好的地方欢迎大牛指点!哦,忘记了还有三张蹩脚的图片没传