开关按钮,上下开关

根据左右滑动的开关修改而来http://blog.csdn.net/xiaanming/article/details/8842453


package com.example.view;

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.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;

import com.example.buttons.R;


public class VerticalSwitch extends View{
    private Bitmap bg_on, bg_off;
    /**
     * 按下时的y和当前的y
     */
    private float downY, nowY;
    /**
     * 记录用户是否在滑动
     */
    private boolean onSlip = false;

    /**
     * 当前的开关状态
     */
    private boolean switchStatus = false;

    //图片实际尺寸
    int bgOnWidth=0;
    int bgOnHight=0;

    //高宽缩放比例
    float scaleW=0.0f;
    float scaleH=0.0f;
    //屏幕宽
    int width=0;
    private onChangeListener listener;
    public interface  onChangeListener{
        public void onChange(boolean state);
    }
    public VerticalSwitch(Context context) {
        super(context);
        init();
    }

    public VerticalSwitch(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public void init(){
        DisplayMetrics metric = new DisplayMetrics();
        width = metric.widthPixels;
        bg_on = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_open);
        bg_off = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_close);
        if(null!=bg_on){
            bgOnWidth=bg_on.getWidth();
            bgOnHight=bg_on.getHeight();
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int specwidth = MeasureSpec.getSize(widthMeasureSpec);
        scaleW=(float)specwidth/bgOnWidth;
        int specHeight=MeasureSpec.getSize(heightMeasureSpec);
        scaleH=(float)specHeight/bgOnHight;

    }
    private int measure(int measureSpec){
        int result = 0;
        //分别获取测量模式 和 测量大小
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        //System.out.println("specMode="+specMode+" specSize="+specSize);
        //如果是精确度模式,呢就按xml中定义的来
        if(specMode == MeasureSpec.EXACTLY){
            result = specSize;
        }
        //如果是最大值模式,就按我们定义的来
        else if(specMode == MeasureSpec.AT_MOST){
            result = width;
        }else{
            result = bgOnWidth;
        }

        return result;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Matrix matrix = new Matrix();
        Paint paint = new Paint();
        matrix.setScale(scaleW,scaleH);
        //根据nowX设置背景,开或者关状态
        if(!switchStatus){
            nowY=bg_off.getHeight()/2*scaleH;
        }

        if (nowY < (bg_off.getHeight()/2*scaleH)){
            canvas.drawBitmap(bg_on, matrix, paint);//画出打开时的背景
        }else{
            canvas.drawBitmap(bg_off, matrix, paint);//画出关闭时的背景
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //return super.onTouchEvent(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN://按下
                if(event.getX()>bg_off.getHeight()*scaleH || event.getY()>bg_off.getWidth()*scaleW){
                    return false;
                }else{
                    onSlip=true;
                    downY=event.getY()*scaleH;
                    nowY=downY;
                }
                break;
            case MotionEvent.ACTION_MOVE://移动
                nowY=event.getY();
                break;
            case MotionEvent.ACTION_UP://弹起
                onSlip=false;
                if(event.getY()>=(bg_on.getHeight()/2*scaleH)){//按到下面为关
                    switchStatus=false;
                    nowY=bg_on.getHeight()*scaleH;
                }else{//按到上面为开
                    switchStatus=true;
                    nowY=0;
                }
                if(listener!=null){
                    listener.onChange(switchStatus);
                }
                break;
        }
        invalidate();
        return true;
    }

    public void setOnChangedListener(onChangeListener listener){
        this.listener = listener;
    }
    //设置状态
    public void setChecked(boolean checked){
        if(checked){
            nowY = 0;
        }else{
            nowY = bg_off.getHeight()*scaleH;
        }
        switchStatus = checked;
    }
}

图片使用两张垂直开关,开和关效果,长宽一致。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值