zoukankan      html  css  js  c++  java
  • 28 自定义滑动开关

    当用户滑动开关时候可以关闭或者开启按钮
    这里写图片描述
    这里写图片描述
    ToggleButton .java

    package com.qf.sxy.customview04.widget;
    
    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.graphics.Rect;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    
    /**
     * Created by sxy on 2016/9/29.
     */
    public class ToggleButton extends View {
        private Bitmap backGroundBitmap ;//背景图
        private Bitmap slidBitmap;//滑动的图片
    
        private Paint mPaint;//画笔对象
        private Matrix matrix;//矩阵
    
        //设置开关的矩阵
        private Rect onRect,offRect;
    
        private int currentX =0;//滑动时  当前的位置
    
        private boolean isSlid =false;//是否是滑动
        private boolean isToggle = false;//是开还是关的状态
    
        //创建一个回调接口
        public interface onToggleButtonListner{
            public void onClick(boolean state);
        }
    
        onToggleButtonListner linstner;
        //设置监听
        public void setToggleButtnLinstner(onToggleButtonListner linstner){
            this.linstner = linstner;
        }
    
    
        public ToggleButton(Context context) {
            super(context);
        }
    
        public ToggleButton(Context context, AttributeSet attrs) {
            super(context, attrs);
            mPaint = new Paint();
            mPaint.setAntiAlias(true);
    
            //获取矩阵对象
            matrix = new Matrix();
        }
    
        //通过逻辑代码  设置背景图和滑动图片
        public void  setToggleButtonBitmap(int backGroundBitmapId,int slidBitmapId ){
            //获取背景图
            backGroundBitmap = BitmapFactory.decodeResource(getResources(),backGroundBitmapId);
            //滑动的图片
            slidBitmap = BitmapFactory.decodeResource(getResources(),slidBitmapId);
    
            //获取关闭的矩阵
            offRect = new Rect(0,0,slidBitmap.getWidth(),backGroundBitmap.getHeight());
            //开的矩阵
            onRect  = new Rect(backGroundBitmap.getWidth()-slidBitmap.getWidth(),0,
                                backGroundBitmap.getWidth(),backGroundBitmap.getHeight());
        }
    
        /**
         * 绘制
         * @param canvas
         */
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            //背景图绘制到画布
            canvas.drawBitmap(backGroundBitmap,matrix,mPaint);
    
            //画滑动的图片
    
            int left = (currentX-slidBitmap.getWidth()/2);
    
            if(isSlid){//判断是否滑动的
                //不让小滑块移动出去
                if(left<offRect.left){
                    left = offRect.left;
                }else if(left>onRect.left){
                    left= onRect.left;
                }
                //正在移动绘制小滑块
                canvas.drawBitmap(slidBitmap,left,onRect.top,mPaint);
            }else{//最终的结果获取
                if(isToggle){//true
                    canvas.drawBitmap(slidBitmap,onRect.left,onRect.top,mPaint);
                }else{
                    canvas.drawBitmap(slidBitmap,offRect.left,offRect.top,mPaint);
                }
            }
    
    
        }
    
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    isSlid = true;
                    currentX = (int) event.getX();
                    break;
                case MotionEvent.ACTION_MOVE:
                    currentX = (int) event.getX();
                    break;
                case MotionEvent.ACTION_UP:
                    isSlid = false;
                    currentX = (int) event.getX();
                    break;
            }
    
            Log.e("AAA","=currentX=>"+currentX);
    
            boolean state = currentX>backGroundBitmap.getWidth()/2;
            //是开还是关状态
            //通过回调接口返回数据   当前状态是开还是关
            if(linstner!=null&&state!=isToggle){
                linstner.onClick(isToggle);
            }
            isToggle = state;
            invalidate();//刷新
            return true;
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            //设置最终的区域
            setMeasuredDimension(backGroundBitmap.getWidth(),backGroundBitmap.getHeight());
        }
    }
    

    MainActivity .java

    package com.qf.sxy.customview04;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    import com.qf.sxy.customview04.widget.ToggleButton;
    
    public class MainActivity extends AppCompatActivity {
    
        private ToggleButton tgBtn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tgBtn = ((ToggleButton) findViewById(R.id.tgBtn));
    
            //给图片设置进去
            tgBtn.setToggleButtonBitmap(R.mipmap.switch_background,R.mipmap.slide_button_background);
    
            //设置监听
            tgBtn.setToggleButtnLinstner(new ToggleButton.onToggleButtonListner() {
                @Override
                public void onClick(boolean state) {
                    if(state){
                        Toast.makeText(MainActivity.this,"开",Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(MainActivity.this,"关",Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }
    

    布局

    <?xml version="1.0" encoding="utf-8"?>
    <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"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.qf.sxy.customview04.MainActivity">
    
        <com.qf.sxy.customview04.widget.ToggleButton
            android:id="@+id/tgBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             />
    </RelativeLayout>
    
  • 相关阅读:
    C++ | Int转十六进制字符串
    Qt | QML Image SSL handshake failed
    《大话数据结构》第一章 数据结构绪论
    8组Beta冲刺4/5
    8组Beta冲刺1/5
    8组Beta冲刺3/5
    8组Beta冲刺2/5
    8组Beta冲刺5/5
    软工实践个人总结
    8组Beta冲刺总结
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152163.html
Copyright © 2011-2022 走看看