自定义switchButton

这篇博客要讲的是自定义switchButton,不过没有设置动画效果。

我用GradientDrawable来绘制switchButton,我们先看看最终的效果:

点击前:

点击后

接下来我们看看如何实现

首先:该类继承RelativeLayout

SwitchButton extends RelativeLayout{}

该类需要用到的成员:

    private ImageView track; //滑块所在的轨道
    private ImageView slider; //switchButton上面的滑块

    private GradientDrawable trackDrawable; //用于绘制轨道
    private GradientDrawable sliderDrawable; //用于绘制滑块

    private LayoutParams trackLy; //轨道的布局
    private LayoutParams sliderLy; //滑块的布局

   private boolean isCkeck = false; //是否点击

构造方法:

public SwitchButton(Context context) {
        super(context);
        init();
    }

    public SwitchButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
private void init(){
        setClickable(true);
        setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        track = new ImageView(getContext());
        slider = new ImageView(getContext());

        trackLy = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        trackLy.addRule(CENTER_VERTICAL);

        sliderLy = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        sliderLy.addRule(CENTER_VERTICAL);

        track.setLayoutParams(trackLy);
        slider.setLayoutParams(sliderLy);

        trackDrawable = new GradientDrawable();
        sliderDrawable = new GradientDrawable();
        //轨道的形状,颜色,大小,边缘,角度
        trackDrawable.setShape(GradientDrawable.RECTANGLE);
        trackDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF));
        trackDrawable.setSize(getResources().getDimensionPixelOffset(R.dimen.track_width),
                getResources().getDimensionPixelOffset(R.dimen.track_height));
        trackDrawable.setStroke(getResources().getDimensionPixelOffset(R.dimen.switch_button_stroke),
                getResources().getColor(R.color.gray));
        trackDrawable.setCornerRadius(getResources().getDimension(R.dimen.switch_button_cornerRadius));
        //设置滑块的形状,颜色,大小,边缘,角度
        sliderDrawable.setShape(GradientDrawable.OVAL);
        sliderDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF));
        sliderDrawable.setSize(getResources().getDimensionPixelOffset(R.dimen.slider_size),
                getResources().getDimensionPixelOffset(R.dimen.slider_size));
        sliderDrawable.setStroke(getResources().getDimensionPixelOffset(R.dimen.switch_button_stroke),
                getResources().getColor(R.color.gray));

        //设置给imageView
        track.setImageDrawable(trackDrawable);
        slider.setImageDrawable(sliderDrawable);

        addView(track);
        addView(slider);

        setOnClickListener(this);
    }

设置点击事件

@Override
    public void onClick(View view) {
        if (isCkeck)
        {
            isCkeck = false;
        }else {
            isCkeck = true;
        }
        setCheck(isCkeck);
    }
private void setCheck(boolean isCheck){
        if (isCheck){            //轨道变为蓝色
            trackDrawable.setColor(getResources().getColor(R.color.blue));            //注意这里进行版本判断。if与else里面代码的效果是相同的,只是有些代码在某些版本下才能够用
            if (Build.VERSION.SDK_INT >= 17) {
                sliderLy.addRule(ALIGN_PARENT_END);                //设置新的布局之前,要先移除之前的布局,否则会有叠加的效果
                sliderLy.removeRule(ALIGN_PARENT_START);
            } else {
                sliderLy.addRule(ALIGN_PARENT_RIGHT);
                sliderLy.addRule(ALIGN_PARENT_LEFT,0);
            }
            slider.setLayoutParams(sliderLy);
        }else {
            trackDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF));
            if (Build.VERSION.SDK_INT >= 17) {
                sliderLy.removeRule(ALIGN_PARENT_END);
                sliderLy.addRule(ALIGN_PARENT_START);
            } else {
                sliderLy.addRule(ALIGN_PARENT_RIGHT,0);
                sliderLy.addRule(ALIGN_PARENT_LEFT);
            }
            slider.setLayoutParams(sliderLy);
        }
    }

 以上便是所有的代码。

请尊重劳动成果,转载请标明出处:http://www.cnblogs.com/tangZH/p/8277428.html

原文地址:https://www.cnblogs.com/tangZH/p/8277428.html

时间: 2024-10-18 21:09:29

自定义switchButton的相关文章

Android 自定义SwitchButton开关控件

SwitchButton开关控件早已经非常流行.有各种各样的样式,SwitchButton开关控件一般用于app软件设置那里,控制缓存.声音.提示.下载等等.是具有很好的UI体验以及用户的习惯性.那么再下面介绍一个SwitchButton开关控件.并附上源码. 源码下载:点击 一.看实现的效果图 二.自定义SwitchButton 这是一个继承CheckBox的SwitchButton类.来实现做这些动画效果的,首先准备好这些图片,然后canvas绘制控件 的边框.背景.以及按钮.绘制时候加上相

andorid 自定义SwitchButton

因项目缘故需重新定制SwitchButton,效果如下:   过程如下: 1.圆角矩形的绘制 2.字体绘制 3.小圆绘制 4.左右滑动动画效果绘制 代码如下: package com.smart.view; import java.util.Timer; import java.util.TimerTask; import android.annotation.SuppressLint; import android.content.Context; import android.graphic

android 自定义开关(SwitchButton)

最近心血来潮,写了一个自定义仿iPhone的开关.有需要的同学可以来下载啦.支持点击自动滚动,速率可以自己根据需要修改.触摸滚动,大小自定义,支持修改样式.就不录制动画,就上传了两张图给大家看看.        主要代码: package com.example.switchbutton; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resou

Android 自定义的开关按钮——SwitchButton

本文转自:http://blog.csdn.net/swust_chenpeng/article/details/19967501 我将原文的控件进行了一些修改,去掉了原来控件的外边框,只留下重要的遮罩.背景和滑块.并且可以在布局文件中预览(预览效果不是太好,凑合看看还可以).自己修改了下监听器,增加了一些方法.总之目前已经和官方的控件差不多了.重要的是可以自定义控件的大小了! 上面粉红色的那个就是我们自定义的控件了,下面的两个是用的官方的控件,自己改样式.基本处于没用的级别. 好了,现在我们开

Android SwitchButton(滑动开关)

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

UI--Android中的状态切换按钮自定义

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/46715453 1.概述 Android中关于控制开关和页面/状态切换的使用场景还是比较多的.源生做的支持也有比如RadioGroup 和Tabhost等.这里准备通过自定义View来模仿学习下IOS两种常见UI样式: SwitchButton 和 SegmentControl. 首先先通过简易的组

自定义Switch过程详解

作者: remcarpediem 联系方式:segmentfault,csdn,简书 本文转载请注明作者.文章来源,链接,版权归作者所有. ?前段时间,我看到了一篇关于Android动画的文章Android View 仿iOS SwitchButton Material Design,十分喜欢文章作者的笔风,可惜每个人的笔风都不同,不过我倒是实现了一个类似的Switch组件,项目地址为https://github.com/ztelur/FunSwitch,就用这篇文章来讲述一下实现过程和机制吧.

Android View 自定义RangeSeekBar范围选择器 走在View进阶之路

前段时间群里兄弟项目中有类似这样的需求 我看到兄弟受苦受难,于心不忍.又因事不关己,打算高高挂起.正在爱恨纠结之时,日神对我说:没事多造点轮子,你的人生会有很多收获.这波鸡汤让我深受触动,于是决定拯救兄弟于水生火热之中. 重写onMeasure 决策自身大小 显而易见当可以拖拽的范围极限为零时,也就是RangeSeeBar正常显示能够接受的极限,粗略一看:Width > 2 * Height @Override protected void onMeasure(int widthMeasureS

Android 自定义View合集

自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/Mr-XiaoLiang 自定义控件三部曲 http://blog.csdn.net/harvic880925?viewmode=contents Android 从0开始自定义控件之View基础知识与概念 http://blog.csdn.net/airsaid/article/details/5