Android 自定义绘制开关按钮

来源:互联网 发布:微软流程图软件 编辑:程序博客网 时间:2024/06/02 05:30

                                     Android 自定义绘制开关按钮





                               在自定义开关按钮中需要用到3种图片


                                         
                                     

                  在自定义View推荐看这个博客(介绍自定义View的一些知识):

package com.example.debugdemo;import com.example.switchdemo.R;import android.annotation.SuppressLint;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.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener; 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.switch_kai);bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.switch_guan);slipper_btn = BitmapFactory.decodeResource(getResources(), R.drawable.switch_huadong);setOnTouchListener(this);}@Overrideprotected 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) {//是否是在滑动状态,  Log.i("TAG","滑动状态");if(nowX >= bg_on.getWidth())//是否划出指定范围,不能让滑块跑到外头,必须做这个判断x = bg_on.getWidth() - slipper_btn.getWidth()/2;//减去滑块1/2的长度elsex = 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); }@Overridepublic boolean onTouch(View v, MotionEvent event) {switch(event.getAction()){case MotionEvent.ACTION_DOWN:{if (event.getX() > bg_off.getWidth() || event.getY() > bg_off.getHeight()){Log.i("TAG","超出了" );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);} }

     这个是一个比较简单的 自定义View

          判断开关 也就是判断 椭圆形这个滑块的当前位置。
          触摸的的滑 就到起点位置,再一次触摸 就到开关图片的一般。
          这样就形成了开关按钮。

            在外部调用onChange() 来回调开关按钮的监听事件

   代码文件:
        自定义滑动开关

               

                  
       
    

  


0 0
原创粉丝点击