已屏蔽掉触摸冲突,直接上代码
package com.pobing.extra.views;
import com.example.iphonebut.R;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class SwitchButton extends LinearLayout {
private int lastX;
TextView top;
TextView bottom;
int marginLeft;
boolean isLeft = true;
int pressX;
ObjectAnimator leftAnimator;
ObjectAnimator rightAnimator;
Context context;
OnSwitchListener listener;
public SwitchButton(Context context) {
super(context);
this.context = context;
initView(context);
}
public SwitchButton(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initView(context);
}
public SwitchButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
initView(context);
}
private void initView(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.switch_but,
null);
top = (TextView) view.findViewById(R.id.top);
bottom = (TextView) view.findViewById(R.id.bottom);
top.setOnTouchListener(new ButTouchListener());
marginLeft = DensityUtil.dip2px(context, 4);
addView(view);
}
private class ButTouchListener implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
pressX = lastX;
leftAnimator = ObjectAnimator.ofFloat(top, "translationX", 0)
.setDuration(80);
rightAnimator = ObjectAnimator.ofFloat(top, "translationX",
bottom.getWidth() - top.getWidth() - marginLeft)
.setDuration(80);
break;
case MotionEvent.ACTION_MOVE:
v.getParent().requestDisallowInterceptTouchEvent(true);// 屏蔽掉回弹控件事件
int dx = (int) event.getRawX() - lastX;
// v.setTranslationX(v.getTranslationX()+dx);
if (v.getTranslationX() + dx < 0)
v.setTranslationX(0);
else if (v.getTranslationX() + dx + v.getWidth() > bottom
.getWidth())
v.setTranslationX(bottom.getWidth() - v.getWidth()
- marginLeft);
else
v.setTranslationX(v.getTranslationX() + dx);
lastX = (int) event.getRawX();
break;
case MotionEvent.ACTION_UP:
int upX = (int) event.getRawX();
if (Math.abs(upX - pressX) == 0) {// 点击事件
isLeft=!isLeft;
if (v.getTranslationX() == 0) {// 状态改变 ,右移
rightAnimator.start();
bottom.setBackgroundResource(R.drawable.green_bg);
//Toast.makeText(context, "右 " , 0).show();
if(listener!=null)
listener.onSwitch(!isLeft);
} else {
leftAnimator.start();
bottom.setBackgroundResource(R.drawable.white_bg);
//Toast.makeText(context, "左", 0).show();
if(listener!=null)
listener.onSwitch(!isLeft);
}
} else if (v.getTranslationX() + v.getWidth() / 2 < bottom
.getWidth() / 2) {
leftAnimator.start();
bottom.setBackgroundResource(R.drawable.white_bg);
if (isLeft == false) {
isLeft = true;
// Toast.makeText(context, "左", 0).show();
if(listener!=null)
listener.onSwitch(!isLeft);
}
}else if (v.getTranslationX() + v.getWidth() / 2 >=bottom
.getWidth() / 2) {
rightAnimator.start();
bottom.setBackgroundResource(R.drawable.green_bg);
if (isLeft == true) {
isLeft = false;
//Toast.makeText(context, "右", 0).show();
if(listener!=null)
listener.onSwitch(!isLeft);
}
}
break;
}
return true;
}
}
public void setOnSwitchListener(OnSwitchListener listener) {
this.listener=listener;
}
public interface OnSwitchListener{
public void onSwitch(boolean isRight);
}
}
circle_but.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android= "http://schemas.android.com/apk/res/android"
android:useLevel= "false" >
<solid android:color= "#ffffff" />
<stroke android:width="2dp"
android:color="#efeff4"/>
<corners android:radius="9999dp"/>
</shape>
white_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android= "http://schemas.android.com/apk/res/android"
android:useLevel= "false" >
<solid android:color= "#efeff4" />
<stroke android:width="2dp"
android:color="#f2f2f2"/>
<corners android:radius="9999dp"/>
</shape>
green_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android= "http://schemas.android.com/apk/res/android"
android:useLevel= "false" >
<solid android:color= "#4bd863" />
<stroke android:width="2dp"
android:color="#f2f2f2"/>
<corners android:radius="9999dp"/>
</shape>
switch_but.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<TextView
android:id="@+id/bottom"
android:background="@drawable/white_bg"
android:layout_width="55dp"
android:layout_height="28dp"
android:layout_centerVertical="true"
/>
<TextView
android:id="@+id/top"
android:background="@drawable/circle_but"
android:layout_centerVertical="true"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginLeft="2dp"
/>
</RelativeLayout>
demo下载地址 点击打开链接