您的位置:首页 > 移动开发 > Android开发

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 详细使用方法

点击进入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐