Android UI设计系列之自定义SwitchButton开关实现类似IOS中UISwitch的动画效果(2)_Android

做IOS开发的都知道,IOS提供了一个具有动态开关效果的UISwitch组件,这个组件很好用效果相对来说也很绚丽,当我们去点击开关的时候有动画效果,但遗憾的是Android上并没有给我们提供类似的组件(听说在Android4.0的版本上提供了具有动态效果的开关组件,不过我还没有去看文档),如果我们想实现类似的效果那该怎么办了呢?看来又得去自定义了。
公司的产品最近一直在做升级,主要做的就是把界面做的更绚丽更美观给用户更好的体验(唉,顾客是上帝......),其中的设置功能中就有开关按钮,原来的开关做的是两幅图片,通过点击图片来给开关设置不同的状态图片,但是这种效果很死板和程序的整体风格不太协调,于是就想着实现类似于IOS中的开关效果。
拿着笔在图纸上画了画,我实现的原理也是采用了两幅图片,一个整体的背景图:和一个小滑块图:,用小滑块图实现在背景图上滑动,当小滑块滑到左边时恰好遮挡了开字,就是显示的关了,同样原理当小滑块滑动到右侧时恰好遮挡了关字也就是现实开了,滑动的实现主要用的就是TranslateAnimation类,如有对TranslateAnimation不太熟悉的,问问度娘,她那有关TranslateAnimation的解说多了去了,毕竟自己动手,丰衣食足嘛,(*^__^*) 嘻嘻……
好了,老规矩来看一下项目结构吧:

工程中switch_button.xml文件就是对应的SwitchButton的布局文件,内容不需要解释,你一看就懂

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/switch_parent"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="@drawable/switch_bg"> 

 <ImageView
  android:id="@+id/switch_button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/switch_btn" /> 

</LinearLayout>

SwitchButton的布局文件中根节点是个LinearLayout,把它的背景设置成了一个含有开关文字的图片,里边包含一个ImageView,这个ImageView就是用来在LinearLayout中进行滑动的。
其中自定义开关组件就是都在wedgit包下的SwitchButton,那么赶紧来看一下SwitchButton的代码吧

public class SwitchButton extends LinearLayout { 

 /**
  * 开关图片
  */
 private LinearLayout switchParent;
 /**
  * 滑块图片
  */
 private ImageView switchButton;
 /**
  * 按钮状态,默认关闭
  */
 private boolean isOn = false;
 /**
  * 滑块需要滑动的距离
  */
 private int scrollDistance;
 /**
  * 开关按钮监听器
  */
 private SwitchChangedListner listner; 

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

 public SwitchButton(Context context, AttributeSet attrs) {
  super(context, attrs);
  initWedgits(context);
 } 

 /**
  * 初始化组件
  *
  * @param context
  *   上下文环境
  */
 private void initWedgits(Context context) {
  try {
   View view = LayoutInflater.from(context).inflate(
     R.layout.switch_button, this);
   switchParent = (LinearLayout) view.findViewById(R.id.switch_parent);
   switchButton = (ImageView) view.findViewById(R.id.switch_button);
   addListeners();
  } catch (Exception e) {
   e.printStackTrace();
  }
 } 

 /**
  * 添加事件监听器
  */
 private void addListeners() {
  try {
   switchParent.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
     isOn = !isOn;
     scrollSwitch();
     if (null != listner) {
      // 开关开发或者关闭的回调方法
      listner.switchChanged(getId(), isOn);
     }
    }
   });
  } catch (Exception e) {
   e.printStackTrace();
  }
 } 

 /**
  * 滑动开关
  */
 private void scrollSwitch() {
  // 获取滑块需要滑动的距离,滑动距离等于父组建的宽度减去滑块的宽度
  scrollDistance = switchParent.getWidth() - switchButton.getWidth();
  // 初始化滑动事件
  Animation animation = null;
  if (isOn) {
   animation = new TranslateAnimation(0, scrollDistance, 0, 0);
  } else {
   animation = new TranslateAnimation(scrollDistance, 0, 0, 0);
  }
  // 设置滑动时间
  animation.setDuration(200);
  // 滑动之后保持状态
  animation.setFillAfter(true);
  // 开始滑动
  switchButton.startAnimation(animation);
 } 

 /**
  * 获取开关状态
  *
  * @return 【true:打开】【false:关闭】
  */
 public boolean isOn() {
  return isOn;
 } 

 /**
  * 设置开关状态
  *
  * @param isOn
  *   开关状态【true:打开】【false:关闭】
  */
 public void setOn(boolean isOn) {
  if (this.isOn == isOn) {
   return;
  }
  this.isOn = isOn;
  post(new Runnable() {
   @Override
   public void run() {
    scrollSwitch();
   }
  });
 } 

 /**
  * 设置开关状态监听器
  *
  * @param listner
  *   开关状态监听器
  */
 public void setOnSwitchListner(SwitchChangedListner listner) {
  this.listner = listner;
 } 

 /**
  * 开关状态监听器
  *
  * @author llew
  *
  */
 public interface SwitchChangedListner {
  /**
   * 开关状态改变
   *
   * @param viewId
   *   当前开关ID
   * @param isOn
   *   开关是否打开【true:打开】【false:关闭】
   */
  public void switchChanged(Integer viewId, boolean isOn);
 }
}

SwitchButton的实现也很简单,首先是初始化组件initWedgits(),然后添加事件监听器addListeners(),在监听器中做逻辑判断,代码都有注释,就不再详细说明了
那么到了最后,我们来看看MainActivity中对SwitchButton的用法吧

public class MainActivity extends Activity { 

 private SwitchButton switchButton; 

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  initWedgits();
 } 

 /**
  * 初始化各组件
  */
 private void initWedgits() {
  try {
   switchButton = (SwitchButton) findViewById(R.id.switchButton);
   // switchButton.setOn(false);
   switchButton.setOn(true);
   addListeners();
  } catch (Exception e) {
   e.printStackTrace();
  }
 } 

 /**
  * 添加事件监听器
  */
 private void addListeners() {
  try {
   switchButton.setOnSwitchListner(new SwitchChangedListner() {
    @Override
    public void switchChanged(Integer viewId, boolean isOn) {
     if(isOn) {
      Toast.makeText(getApplicationContext(), "开关打开了", Toast.LENGTH_LONG).show();
     } else {
      Toast.makeText(getApplicationContext(), "开关关闭了", Toast.LENGTH_LONG).show();
     }
    }
   });
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

好了,代码都贴完了,接下来看看运行效果吧,(*^__^*) 嘻嘻……

很遗憾的是,木有动画效果,呜呜~~~~(>_<)~~~~ ,先这样吧,呵呵
好了,基本上自定义开关组件到这里就讲完了,如有不足,请大家谅解。

源码下载: Android UI实现类似IOS中UISwitch的动画效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ios
, android
, ui
, 开关
, UISwitch
SwitchButton
自定义switchbutton、uiswitch 自定义、uiswitch 自定义图片、ios自定义uiswitch、uiswitch 自定义大小,以便于您获取更多的相关知识。

时间: 2024-10-04 00:08:16

Android UI设计系列之自定义SwitchButton开关实现类似IOS中UISwitch的动画效果(2)_Android的相关文章

Android UI设计系列之自定义ListView仿QQ空间阻尼下拉刷新和渐变菜单栏效果(8)_Android

好久没有写有关UI的博客了,刚刚翻了一下之前的博客,最近一篇有关UI的博客:Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7) ,实现各种风格效果的对话框,在那篇博客写完后由于公司封闭开发封网以及其它原因致使博客中断至今,中断这么久很是惭愧,后续我会尽量把该写的都补充出来.近来项目有个需求,要做个和QQ空间类似的菜单栏透明度渐变和下拉刷新带有阻尼回弹的效果.于是花点时间动手试了试,基本上达到了QQ空间的效果,截图如下:         通过观察QQ空间的运行效果,发现

Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7)_Android

虽然Android给我们提供了众多组件,但是使用起来都不是很方便,我们开发的APK都有自己的风格,如果使用了系统自带的组件,总是觉得和应用的主题不着边际并且看起来也不顺心,那我们就需要自定义了,为了方便大家对自定义组件的学习,我接下来准备了几遍有关自定义的Dialog的文章,希望对大家有帮助. 在开发APK中最常见的估计就数弹出对话框了,这种对话框按照按钮数量来分大致是三种:一个按钮,两个按钮,三个按钮.现在要讲的就是按照按钮数量分为以上三类吧(当然了可以有更多的按钮,只要你愿意). 自定义Di

Android UI设计系列之自定义ViewGroup打造通用的关闭键盘小控件ImeObserverLayout(9)_Android

转载请注明出处:http://blog.csdn.net/llew2011/article/details/51598682 我们平时开发中总会遇见一些奇葩的需求,为了实现这些需求我们往往绞尽脑汁有时候还茶不思饭不香的,有点夸张了(*^__^*)--我印象最深的一个需求是在一段文字中对部分词语进行加粗显示.当时费了不少劲,不过还好,这个问题最终解决了,有兴趣的童靴可以看一下:Android UI设计之<六>使用HTML标签,实现在TextView中对部分文字进行加粗显示. 之前产品那边提了这样

Android UI设计系列之自定义TextView属性实现带下划线的文本框(4)_Android

在Android开发过程中,如果Android系统自带的属性不能满足我们日常开发的需求,那么就需要我们给系统控件添加额外的属性了.假如有个需求是实现带下划线的文本显示(下划线),如果不使用自定义属性的话实现起来也不太难(起码我认为的实现方式是有许多种的),今天就讲解一下如何使用自定义属性来实现上述带下划线的文本框吧.还好Android中自定义属性不是很复杂,也可以归纳为三步走吧. 老规矩,还是先贴出工程目录吧: 一.添加属性文件 在values文件夹中新建attrs.xml文件,在文件中新建属性

Android UI设计系列之自定义DrawView组件实现数字签名效果(5)_Android

最近项目中有个新的需求,用户在完交易需要进行输入支付密码付款的时候,要让用户签下自己的签名,提起到数字签名这个东西,感觉有点高大上,后来想想数字签名的原理也不是太复杂,主要实现原理就是利用了View的绘图原理,把用户在屏幕上的手指移动轨迹显示在屏幕上,接着把在屏幕上显示的轨迹View转换成一张图片,最后把图片保存到本地或者上传到服务器... 还是老规矩,首先看一下工程目录吧: public class DrawView extends View { /** * 签名画笔 */ private P

Android UI设计系列之自定义EditText实现带清除功能的输入框(3)_Android

最近公司的产品在陆续做升级,上级领导给的任务是优化代码结构以及项目架构,力争把项目写的精巧简练,于是我们满工程找冗余... 我们都知道每一个项目基本上都是有登陆页的,在登陆页中肯定是少不了输入框了,当我们在输入框中输入数据后如果输入的内容不正确或者是错误的或者是想重新输入,如果嗯键盘上的删除键就得一个一个的去删除,这时候我们或许就想要是能有一个标记当点击了这个标记能把我们刚刚输入的内容清空就好了.这样可以极大的提升用户体验,就拿QQ的登陆来说吧,效果如下: 当点击密码框右侧的小×图标时输入的内容

Android UI设计系列之自定义DrawView组件实现数字签名效果(5)

最近项目中有个新的需求,用户在完交易需要进行输入支付密码付款的时候,要让用户签下自己的签名,提起到数字签名这个东西,感觉有点高大上,后来想想数字签名的原理也不是太复杂,主要实现原理就是利用了View的绘图原理,把用户在屏幕上的手指移动轨迹显示在屏幕上,接着把在屏幕上显示的轨迹View转换成一张图片,最后把图片保存到本地或者上传到服务器... 还是老规矩,首先看一下工程目录吧: public class DrawView extends View { /** * 签名画笔 */ private P

Android UI设计系列之自定义EditText实现带清除功能的输入框(3)

最近公司的产品在陆续做升级,上级领导给的任务是优化代码结构以及项目架构,力争把项目写的精巧简练,于是我们满工程找冗余... 我们都知道每一个项目基本上都是有登陆页的,在登陆页中肯定是少不了输入框了,当我们在输入框中输入数据后如果输入的内容不正确或者是错误的或者是想重新输入,如果嗯键盘上的删除键就得一个一个的去删除,这时候我们或许就想要是能有一个标记当点击了这个标记能把我们刚刚输入的内容清空就好了.这样可以极大的提升用户体验,就拿QQ的登陆来说吧,效果如下: 当点击密码框右侧的小×图标时输入的内容

Android UI设计系列之HTML标签实现TextView设置中文字体加粗效果(6)_Android

搞软件开发的都知道项目中各种需求都有,而有时候各种奇葩的需求真是让人大跌眼镜,为了实现这些奇葩的需求我们往往苦逼的废寝忘食,我现在的项目中就有一个应该算得上奇葩的需求吧,需求是这样的:在一段文字中实现对部分文字加粗这个看上去也不难并且有点小儿科,因为TextView中有个属性是Android:textStyle,它其中一个值是bold,也就是说是对将要显示的文字进行加粗,于是我就在TextView控件中添加了此属性,代码如下: <TextView android:layout_width="