Android 自定义简单的滑动效果switch开关
2017-01-03 11:40
423 查看
package com.circle.ctrls; import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import com.circle.utils.Utils; import com.taotie.circle.R; /** * Created by xyz on 2016/12/20. * 自定义switch开关 */ public class CustomSwitch extends FrameLayout { private Context context; private final static int MP=ViewGroup.LayoutParams.MATCH_PARENT; private final static int WC=ViewGroup.LayoutParams.WRAP_CONTENT; private Drawable bg_on; private Drawable bg_off; private ImageView ball; private ImageView switchBg; private int local_state =0;//本地状态 0:关 1:开 public CustomSwitch(Context context, AttributeSet attrs,int defStyle){ super(context,attrs,defStyle); init(context); this.context=context; } public CustomSwitch(Context context,AttributeSet attrs){ super(context,attrs); init(context); this.context=context; } public CustomSwitch(Context context){ super(context); init(context); this.context=context; } private void init(Context context){ /**整体布局预设**/ bg_on = getResources().getDrawable(R.drawable.switch_on_bg); bg_off =getResources().getDrawable(R.drawable.switch_off_bg); FrameLayout.LayoutParams FParams=new FrameLayout.LayoutParams(WC,Utils.getRealPixel(59)); setLayoutParams(FParams); ImageView switch_default_Bg=new ImageView(context); FParams=new FrameLayout.LayoutParams(WC,WC); switch_default_Bg.setImageResource(R.drawable.switch_off_bg); addView(switch_default_Bg,FParams); switchBg=new ImageView(context); FParams=new FrameLayout.LayoutParams(WC,WC); addView(switchBg,FParams); //开关圆球 LinearLayout ballLayout=new LinearLayout(context); ballLayout.setOrientation(LinearLayout.HORIZONTAL); FParams=new FrameLayout.LayoutParams(WC,WC); FParams.gravity = Gravity.BOTTOM; addView(ballLayout,FParams); ball=new ImageView(context); LinearLayout.LayoutParams lParams=new LinearLayout.LayoutParams(WC,WC); ball.setImageResource(R.drawable.switch_thumb); ballLayout.addView(ball,lParams); // turnOff(0); setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(local_state ==0){ turnOn(200); }else{ turnOff(200); } if(onSwitchClickListener != null){ onSwitchClickListener.onClickSwitch(local_state); } } }); } /** * 需要详细配置请看 {@link #turnOn(int time)} * 打开按钮,带渐变动画 * @param time 渐变时间 * 0 马上设置成打开状态 * */ private void turnOn(int time){ // ballLayout.setGravity(Gravity.RIGHT); switchBg.setImageDrawable(getResources().getDrawable(android.R.color.transparent)); ball.setPadding(Utils.getRealPixel(40),0,0,0); // switchBg.setBackgroundResource(R.drawable.switch_on_bg); local_state =1; TransitionDrawable td; if(time==0) { td = new TransitionDrawable(new Drawable[]{bg_on,bg_on}); }else{ td = new TransitionDrawable(new Drawable[]{getResources().getDrawable(android.R.color.transparent),bg_on}); } td.setCrossFadeEnabled(true); td.startTransition(time); switchBg.setImageDrawable(td); } /** * 需要详细配置请看 {@link #turnOff(int time)} * 打开按钮,带渐变动画 * @param time 渐变时间 * 0 马上设置成关闭状态 * */ private void turnOff(int time){ // ballLayout.setGravity(Gravity.RIGHT); switchBg.setImageDrawable(getResources().getDrawable(android.R.color.transparent)); ball.setPadding(0,0,Utils.getRealPixel(40),0); // switchBg.setBackgroundResource(R.drawable.switch_off_bg); local_state =0; TransitionDrawable td; if(time==0) { td = new TransitionDrawable(new Drawable[]{getResources().getDrawable(android.R.color.transparent),getResources().getDrawable(android.R.color.transparent)}); }else{ td = new TransitionDrawable(new Drawable[]{bg_on, getResources().getDrawable(android.R.color.transparent)}); } td.setCrossFadeEnabled(true); td.startTransition(time); switchBg.setImageDrawable(td); } //以渐变效果,在200ms内打开开关 public void transitionOn(){ turnOn(200); } //以渐变效果,在200ms内关闭开关 public void transitionOff(){ turnOff(200); } //无渐变效果,强制打开开关 public void switchOn(){ turnOn(0); } //无渐变效果,强制关闭开关 public void switchOff(){ turnOff(0); } //获取开关本地状态 public int getLocalState(){ return this.local_state; } //点击时回传switch 状态,0为关闭,1为打开 public interface OnSwitchClickListener{ void onClickSwitch(int local_state); } private OnSwitchClickListener onSwitchClickListener; public void setOnSwitchClickListener(OnSwitchClickListener l){ this.onSwitchClickListener=l; } }
效果
使用到transitionDrawable 详细使用方法
点击进入
相关文章推荐
- 【Android UI】自定义Switch(无滑动效果)
- [Android开发] 自定义View之重写View非常简单实现开关按钮SwitchView
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果 .
- 防人人网客户端侧滑效果,简单实现Android滑动菜单特效
- Android 自定义实现switch开关按钮
- Android自定义View示例(二)—滑动开关
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
- android自定义滑动开关控件,适合所有的android系统
- android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
- Android可滑动的开关效果
- android自定义滑动开关控件,适合所有的android系统
- Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
- Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
- Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
- Android自定义View示例(二)—滑动开关