自定义滑动Button开关

自定义控件

package test.baway.com.mybutton.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by gateway on 2016/6/21.
 */
public class MyToggleButton extends View {
    private Bitmap bgPic;
    private Bitmap iconPic;
    private  float toggleLeft;
    private  float toggleMaxLeft;
    private boolean isOpen=false;
    private  boolean isHandsUp = false;
    private OnTogglelistener onToggleListener;
    public MyToggleButton(Context context) {
        super(context);
    }

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

    }

    private void init(AttributeSet attrs) {
        //1.获取命名空间
        String namespace = "http://schemas.android.com/apk/res-auto";
        //从自定义属性中获取我们设置的值
        int backgroundId = attrs.getAttributeResourceValue(namespace, "mybackground", -1);
        int iconId = attrs.getAttributeResourceValue(namespace, "myicon", -1);
        System.out.println("backgroundId---------"+backgroundId+"------iconId----------"+iconId);
        boolean toggleState = attrs.getAttributeBooleanValue(namespace, "mytoggle", false);
        if(backgroundId != -1 && iconId != -1){
            setBackGroundPic(backgroundId, iconId);
        }
        setState(toggleState);
    }

    public MyToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs);
    }

    private void setState(boolean isOpen) {
        isHandsUp=true;
        if(isOpen){
            toggleLeft=toggleMaxLeft;
        }else{
            toggleLeft=0;
        }
    }

    /**
     * 设置滑动开关背景图
     * @param bgpic 背景图片
     * @param iconpic 滑动图片
     */
    public void setBackGroundPic(int bgpic,int iconpic){
        this.bgPic= BitmapFactory.decodeResource(getResources(),bgpic);
        this.iconPic=BitmapFactory.decodeResource(getResources(),iconpic);
        toggleMaxLeft=this.bgPic.getWidth()-this.iconPic.getWidth();
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(bgPic.getWidth(),bgPic.getHeight());
    }

    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawBitmap(bgPic,0,0,null);

        //不让滑出左边
        if(toggleLeft<0){
            toggleLeft=0;
        }

        //不如滑出右边
        if(toggleLeft>toggleMaxLeft){
            toggleLeft=toggleMaxLeft;
        }

        isOpen = toggleLeft>0;
        if(isHandsUp){
            if(onToggleListener!=null){
                onToggleListener.onToggle(isOpen);
            }
            isHandsUp=false;
        }
        canvas.drawBitmap(iconPic,toggleLeft,0,null);
        super.onDraw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                toggleLeft=event.getX()-iconPic.getWidth()/2;
                break;
            case MotionEvent.ACTION_MOVE:
                toggleLeft=event.getX()-iconPic.getWidth()/2;
                break;
            case MotionEvent.ACTION_UP:
                isHandsUp=true;
                if(event.getX()>bgPic.getWidth()/2){
                    toggleLeft=toggleMaxLeft;
                }else{
                    toggleLeft=0;
                }

                break;

        }

        invalidate();
        return true;
    }

    public void setOnToggleListener(OnTogglelistener onToggleListener){
        this.onToggleListener=onToggleListener;
    }
    public interface OnTogglelistener{
        void onToggle(boolean isOpen);
    }
}

方式一:

//通过set的方式设置背景和滑动按钮

布局中

 <test.baway.com.mybutton.view.MyToggleButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn" />

activity中

  MyToggleButton btn = (MyToggleButton) findViewById(R.id.btn);//通过set的方式设置背景和滑动按钮
       btn.setBackGroundPic(R.mipmap.slide_background2,R.mipmap.slide_icon2);

        btn.setOnToggleListener(new MyToggleButton.OnTogglelistener() {
            @Override
            public void onToggle(boolean isOpen) {
                if(isOpen){
                    Toast.makeText(MainActivity.this,"打开",Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(MainActivity.this,"关闭",Toast.LENGTH_SHORT).show();
                }
            }
        });

方式二:

//通过自定义属性的方式设置背景和滑动按钮

values中创建attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyToggleButton">
        <attr name="mybackground" format="reference"></attr>
        <attr name="myicon" format="reference"></attr>
        <attr name="mytoggle" format="boolean"></attr>
    </declare-styleable>
</resources>

布局中

添加命名空间

AS中:xmlns:app="http://schemas.android.com/apk/res-auto"(eclipse中把res-auto改成包名)
 <test.baway.com.mybutton.view.MyToggleButton
        app:mybackground="@mipmap/slide_background"
        app:myicon="@mipmap/slide_icon"
        app:mytoggle="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn" />

activity中

  MyToggleButton btn = (MyToggleButton) findViewById(R.id.btn);

        btn.setOnToggleListener(new MyToggleButton.OnTogglelistener() {
            @Override
            public void onToggle(boolean isOpen) {
                if(isOpen){
                    Toast.makeText(MainActivity.this,"打开",Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(MainActivity.this,"关闭",Toast.LENGTH_SHORT).show();
                }
            }
        });
时间: 2024-11-06 09:36:08

自定义滑动Button开关的相关文章

WPF 自定义滑动ScrollViewer

自定义滑动滚动条 预期目标:横向滚动条,可以左右滑动,用鼠标按住(触摸)然后释放可以实现快速滑动. 我们有几种方案: 1.ScrollViewer,修改其中的横向滚动条,将其中的背景设置为透明. 但是,存在的问题是,没有快速滑动的效果 2.ListBox,修改Panel为WrapPanel,或者直接将内容作为ItemSource填充进去. 这个能实现多个子元素切换的效果,但是针对单个或者一个区域的内容,就有点大材小用了. 3.用DevExpress中的LayoutControl.ScrollBo

可自定义滑动速度的下滑展开菜单

<!DOCTYPE html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>jQuery动感滑动下拉菜单</title><script type="text/javascript" src="/ajaxjs/jquery-1.6.2.min.js"

IOS 自定义 滑动返回 手势

/** 只需要在你自定义的导航控制器中,改成如下代码即可,自定义手势返回 */ #define KEY_WINDOW [[UIApplication sharedApplication] keyWindow] #define kScreenW KEY_WINDOW.bounds.size.width #define kAnimateDuration 0.3 #define kDefaultAlapa 0.5 #define kDefaultScale 0.95 #define iOS7 ([UI

iOS彩票项目--第五天,新特性引导页的封装、返回按钮的自定义、导航控制器的滑动返回以及自定义滑动返回功能

一.上次实现了在AppDelegate中通过判断app版本决定是否进入新特性页面,今天将AppDelegate中的一坨进行了封装.将self.window的根控制器到底应该为新特性界面,还是主页面,封装到了导航工具类ChaosGuideTool 封装,先决定外面怎么用,然后实现方法.外部通过类方法调用  + (UIViewController *)chooseRootVC; 外部的APPDelegate 只是调用方法 之前的业务判断没有改变,只是将数据的存储进行了封装 二.返回按钮的自定义 <1

自定义滑动删除item的ListView。

首先继承创建继承ListView和实现OnTouchListener,OnGestureListener的类. 会使用到AbsList中的pointToPosition(int x, int y)方法,这个方法主要是根据点击的位置获取点击行的在列表中的索引. 还有ViewGroup中的getChildAt(int index)方法,主要用于根据当前的索引获取子控件.这个(这个索引以可见屏幕顶端开始). 之所以实现OnTouchListener,OnGestureListener.是因为OnGes

Ext 6.5.3 classic版本,自定义实现togglefield开关控件

1,在Ext 6.5.3的classic版中没有提供开关控件,参照modern版中 togglefield开关的实现,继承滑动器(sliderfield),自定义一个开关按钮.支持value绑定和点击切换状态以及表单提交. 2,完成后效果如图: 3, js代码如下: //基于滑动器自定义开关控件, by xxx Ext.define('ux.slider.Toggle', { extend: 'Ext.slider.Single', alias: 'widget.uxSliderToggle',

Android自定义的button按钮

<TextView android:id="@+id/entry" android:layout_width="match_parent" android:layout_height="40dp" android:background="@drawable/shape_button_sure" android:layout_marginLeft="10dp" android:layout_margin

viewpager滑动button按钮选项卡跟着变动颜色

package com.example.day8viewpager; import java.util.ArrayList;import java.util.List; import android.os.Bundle; import android.app.Activity;import android.graphics.Color;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager

【Android】自定义控件实现可滑动的开关(switch)

~转载请注明来源:http://blog.csdn.net/u013015161/article/details/46704745 介绍 昨天晚上写了一个Android的滑动开关, 即SlideSwitch.效果如下: 实现 实现的思路其实很简单,监听控件上的touch事件,并不断刷新,让滑块在手指的位置上绘出,达到滑块跟着手指滑动的显示效果. 先看一下代码: SlideSwitch.java package com.example.slideswitchexample; import andr