滑动按钮

public class WiperSwitch extends View {
    private Bitmap selectedBitmap;//滑动选中开关的背景
    private Bitmap uncheckedBitmap;//滑动未选中开关的背景
    private Bitmap switchBitmap;//开关的背景
    private Bitmap slidBitmap;//滑动块的图片对象
    private int MAX_Left;//left的最大值
    private int slidLeft ;//滑块left的值,默认为0
    private boolean isOpen = false;//记录滑动开关的状态,默认为关闭,false
    private OnCheckChangeListener mOnCheckChangeListener;//点击事件回调接口对象
    private int startX;

    private int moveX;//记录手指在控件上,x轴的移动
    private boolean isClick ;//记录当前是否是点击事件

    //在xml里面使用样式,创建该控件时,调用这个构造方法
    public WiperSwitch(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
    //在xml里面引用该控件时,就调用该构造方法
    public WiperSwitch(Context context, AttributeSet attrs) {
        super(context, attrs);
        String namespace = "http://schemas.android.com/apk/res-auto";
        isOpen = attrs.getAttributeBooleanValue(namespace , "isOpen", false);
        if (isOpen) {
            slidLeft = MAX_Left;
        }else{
            slidLeft = 0;
        }

        int slidBitmapId = attrs.getAttributeResourceValue(namespace, "slidBitmap", -1);
        if (slidBitmapId > -1) {
            slidBitmap = BitmapFactory.decodeResource(getResources(), slidBitmapId);
        }
        int selectedBitmapId = attrs.getAttributeResourceValue(namespace, "selectedImage", -1);
        if (slidBitmapId > -1) {
            selectedBitmap = BitmapFactory.decodeResource(getResources(), selectedBitmapId);
        }
        int uncheckedBitmapId = attrs.getAttributeResourceValue(namespace, "uncheckedImage", -1);
        if (slidBitmapId > -1) {
            uncheckedBitmap = BitmapFactory.decodeResource(getResources(), uncheckedBitmapId);
        }

        init();
        invalidate();
    }
    //当该控件,使用代码创建的时间,调用该构造方法
    public WiperSwitch(Context context) {
        super(context);
        init();
    }
    //初始化方法
    private void init() {

        if (isOpen)
            switchBitmap = selectedBitmap;
        else
            switchBitmap = uncheckedBitmap;

        MAX_Left = (int) (switchBitmap.getWidth() - (slidBitmap.getWidth()*1.25f));

        if (isOpen){
            slidLeft = MAX_Left;
        }else{
            slidLeft = 0;
        }

        this.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (isClick) {//点击事件
                    if (isOpen) {//如果开则关闭
                        System.out.println("关闭");
                        isOpen = false;
                        slidLeft = 0;
                        switchBitmap = uncheckedBitmap;
                    }else{//如果关则打开
                        System.out.println("打开");
                        isOpen = true;
                        slidLeft = MAX_Left;
                        switchBitmap = selectedBitmap;
                    }
                    //重新调用ondraw方法
                    invalidate();//强制view进行重绘操作,重新调用ondraw方法
                    //             isOpen = !isOpen;

                    if (mOnCheckChangeListener != null) {
                        mOnCheckChangeListener.onCheckChanged(WiperSwitch.this, isOpen);
                    }

                }
            }

        });
    }
    //测量方法
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        //    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(switchBitmap.getWidth(), switchBitmap.getHeight());

    }

    //绘制方法
    /**
     * Canvas 画布:把控件绘制在画布,才能显示到屏幕上
     */
    @Override
    protected void onDraw(Canvas canvas) {

        //    canvas.drawRect(0, 0, 200, 200, paint );
        canvas.drawBitmap(switchBitmap, 0, 0, null);
        canvas.drawBitmap(slidBitmap, slidLeft, 0, null);
    }

    public void setOnCheckChangeListener(OnCheckChangeListener listener){
        this.mOnCheckChangeListener = listener;
    }

    //滑动开关 的点击事件回调接口
    public interface OnCheckChangeListener{
        public void onCheckChanged(View v,boolean isOpen);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //1、记录手指按下的起始点
                startX = (int) event.getX();
                break;
            case MotionEvent.ACTION_MOVE:
                //2、记录手指移动后的结束点
                int endX = (int) event.getX();
                //3、计算出移动间距
                int diffX = endX -startX;

                moveX = moveX + Math.abs(diffX);

                //4、更新slidleft的值
                slidLeft += diffX;
                //       slidLeft = slidLeft + diffX;

                if (slidLeft < 0) {//设置左边界
                    slidLeft = 0;
                }
                if (slidLeft > MAX_Left) {//设置右边界
                    slidLeft = MAX_Left;
                }

                //5、重绘控件
                invalidate();
                //6、更新起始点
                startX = endX;
                break;
            case MotionEvent.ACTION_UP:

                if (moveX > 5) {//手指移动的间距大于5个像素,就认为是一个滑动事件
                    isClick = false;
                }else{//手指移动的间距小于5个像素,就认为是一个点击事件
                    isClick = true;
                }

                moveX = 0;

                if (!isClick) {//如果是滑动事件
                    //计算出中心线
                    int center = MAX_Left/2;
                    if (slidLeft > center) {//大于中心线的话,就显示为打开
                        isOpen = true;
                        slidLeft = MAX_Left;
                        switchBitmap = selectedBitmap;
                    }else{//小于中心线的话,就显示为关闭
                        isOpen = false;
                        slidLeft = 0;
                        switchBitmap = uncheckedBitmap;
                    }
                    invalidate();
                    //手指抬起后,将状态值返回给主界面
                    if (mOnCheckChangeListener != null) {
                        mOnCheckChangeListener.onCheckChanged(WiperSwitch.this, isOpen);
                    }
                }

                invalidate();
                break;
            default:
                break;
        }
        return super.onTouchEvent(event);//自己去消费触摸事件
    }

}
/*********************** Style *********************/

<declare-styleable name="WiperSwitch">
    <attr name="slidBitmap" format="reference" />
    <attr name="selectedImage" format="reference" />
    <attr name="uncheckedImage" format="reference" />
    <attr name="isOpen" format="boolean" />
</declare-styleable>
/*********************** Xml *********************/
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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.wiperswitchview.MainActivity">

    <com.wiperswitchview.view.WiperSwitch
        app:isOpen="true"
        app:slidBitmap="@drawable/action_btn"
        app:selectedImage="@drawable/action_on"
        app:uncheckedImage="@drawable/action_off"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/switchbtn"
       />
</RelativeLayout>
/*********************** MainActivity*********************/
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WiperSwitch wiperSwitch = (WiperSwitch) findViewById(R.id.switchbtn);
        wiperSwitch.setOnCheckChangeListener(new WiperSwitch.OnCheckChangeListener() {
            @Override
            public void onCheckChanged(View v, boolean isOpen) {
                if (isOpen){
                    Toast.makeText(MainActivity.this,"开",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(MainActivity.this,"关",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}
时间: 2024-08-10 19:15:44

滑动按钮的相关文章

5个基于css3超炫的鼠标滑动按钮动画

今天给大家分享5个基于css3超炫的鼠标滑动按钮动画.这5个按钮鼠标经过的时候有超炫的动画效果.这5个按钮适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8及以下浏览器.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="wrap"> <a href="#" class="btn-slide"><span class=&q

适合移动设备的jQuery滑动按钮插件

这是一款非常实用的jQuery滑动按钮插件.该滑动按钮插件可以将input元素转换为滑动按钮样式.插件中使用javascript来控制滑动按钮的滑动,样式使用纯CSS来制作. 该jQuery滑动按钮插件可以在支持jQuery 2的浏览器上工作,IE6-8不支持该插件. IE9不支持CSS transitions,在IE9上不会有动画效果. 该滑动按钮支持Pointer.触摸屏和鼠标点击. 在线演示:http://www.htmleaf.com/Demo/201502241416.html 下载地

自己开发的 vue 滑动按钮组件 vue-better-slider

写在前面的 这个人第一次尝试开发并发布一个 vue 的组件,该组件实现了类似 ios 手机淘宝客户端 -> 消息界面中消息的滑动删除功能等,如下为该组件的文档. 一个 Vue 的滑动按钮组件,有关滑动方面的处理借鉴 better-scroll 的实现. 在线例子 起步 安装 npm i --save vue-sliding-button 引入 import Vue from 'vue' import SlidingButton from 'vue-sliding-button' Vue.use(

UITableView滑动按钮的操作

一.开题  首先先创建工程, 创建工程的步骤就不一一介绍了, 前面有提过, 接下来是要在VC上创建一个tableview当然你也可以选择一个类继承于UITableView两者都可以, 这要看个人喜欢了, 这些都不是很重要, 重要的在后面呢, 也是我要说的, 敬请期待吧! tableview上传统的delete键是这个样子的, 也就是在滑动cell的时候出来的按钮: 当然这样并不能满足我们的需求, 有时间我们还想要让delete显示为中文样式或者改变显示的文字, 那我们要怎么做呢, 不要着急下面我

js实例6滑动按钮

<style type="text/css">*{ margin:0px auto; padding:0px}#wai{ width:100%; height:500px;}#left{height:500px; background-color:#63C; float:left}#right{ height:500px; background-color:#FC3; float:left}#anniu{ width:50px; height:50px; backgroun

android 自定义滑动按钮

第一接触公司项目就让我画页面,而且还涉及到我最讨厌的自定义view  但是没办法,讨厌也必须要做啊,经过百度上资源的查找,终于写出了一个滑动控件.废话不多说,上代码. package com.etong.cpms.widget; import com.etong.cpms.activity.R; import android.content.Context;  import android.graphics.Bitmap;  import android.graphics.BitmapFacto

基于css3的鼠标滑动按钮动画之CSS--续

btn2 /*--按钮1--*/ .container1 {   width:200px;   display:block;   margin:20px auto;   position:relative;   font-family:droid arabic kufi; } .con_down1 {   display:block;   cursor:pointer;   background-color:#F6EB96;   width:190px;   height:50px;   pad

android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中没有数据. 如下面的代码: 这就是在initData中异步获取服务器的数据,然后实例化adatper,再将adapter赋给listView. 2.initData()中的代码是: 这里线程要睡眠5秒钟,是为了模仿网络的耗时操作 3.Handler: 在Handler中接收到数据后给list赋值后,

[android] 切换按钮-自定义控件

准备两张图片,按钮背景,上面的小开关 创建一个类MyToggleBtn,继承View 实现三个构造方法,传递上下文, 实现构造方法,传递Context对象,在java代码中实例化时主要使用这个 实现构造方法,传递Context对象,AttributeSet对象,在布局文件中主要使用 View对象显示在屏幕上,有几个重要步骤 1.构造方法创建对象 2.测量view的大小 onSeasure(int,int) 3.确定view的位置,view自身有一些建议权,决定权在父view手中 onLayout