自定义MyToggleButton
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by ASUS on 2016/6/20.
*/
public class MyToggleButton extends View{
private Bitmap bgPic;
private Bitmap togglePic;
private float toggleLeft;
private float toggleMaxLeft;
private OnToggleListener onToggleListener;
private boolean isOpen = false;
private boolean isHandsUp = false;//是否手抬起
public MyToggleButton(Context context) {
this(context, null);
}
public MyToggleButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//1.获取命名空间
String namespace = "http://schemas.android.com/apk/res-auto";
//从自定义属性中获取我们设置的值
int backgroundId = attrs.getAttributeResourceValue(namespace, "background", -1);
int iconId = attrs.getAttributeResourceValue(namespace, "icon", -1);
boolean toggleState = attrs.getAttributeBooleanValue(namespace, "togglestate", false);
if (backgroundId != -1 && iconId != -1) {
setBackGroundPic(backgroundId, iconId);
}
setState(false);
}
private void setState(boolean isOpen) {
isHandsUp = true;
if (isOpen) {
toggleLeft = toggleMaxLeft;
} else {
toggleLeft = 0;
}
}
/**
* 设置滑动开关背景图
*
* @param bgPic 背景图片
* @param togglePic 滑动图片
*/
public void setBackGroundPic(int bgPic, int togglePic) {
this.bgPic = BitmapFactory.decodeResource(getResources(), bgPic);
this.togglePic = BitmapFactory.decodeResource(getResources(), togglePic);
toggleMaxLeft = this.bgPic.getWidth() - this.togglePic.getWidth();
}
/**
* 确定 togglebutton
*/
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(bgPic.getWidth(),bgPic.getHeight());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bgPic, 0, 0, null);
//不让滑动开关滑出左边
if (toggleLeft < 0) {
toggleLeft = 0;
}
//不让滑动开关滑出右边
if (toggleLeft > toggleMaxLeft) {
toggleLeft = toggleMaxLeft;
}
isOpen = toggleLeft > 0;
if (isHandsUp) {
if (onToggleListener != null) {
onToggleListener.onToggle(isOpen);
}
isHandsUp = false;
}
canvas.drawBitmap(togglePic, toggleLeft, 0, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
toggleLeft = event.getX() - togglePic.getWidth()/2;
break;
case MotionEvent.ACTION_MOVE:
toggleLeft = event.getX() - togglePic.getWidth()/2;
break;
case MotionEvent.ACTION_UP:
isHandsUp = true;
//设置开关自动弹回
if(event.getX()>bgPic.getWidth()/2){
toggleLeft = toggleMaxLeft;
}else{
toggleLeft = 0;
}
break;
}
invalidate();
return true;
}
public void setOnToggleListener(OnToggleListener onToggleListener) {
this.onToggleListener = onToggleListener;
}
public interface OnToggleListener {
void onToggle(boolean isOpen);
}
}
MainActivity中
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyToggleButton myToggleButton = (MyToggleButton) findViewById(R.id.mytoggle);
myToggleButton.setBackGroundPic(R.drawable.slide_background,R.drawable.slide_icon);
myToggleButton.setOnToggleListener(new MyToggleButton.OnToggleListener() {
@Override
public void onToggle(boolean isOpen) {
if(isOpen){
Toast.makeText(MainActivity.this, "open------", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "close------", Toast.LENGTH_SHORT).show();
}
}
});
}
}
values/attrs.xml
<pre name="code" class="html"> <resources>
<declare-styleable name="MyToggleButton">
<attr name="mybackgroud" format="reference" />
<attr name="myicon" format="reference" />
<attr name="mytogglestate" format="boolean" />
</declare-styleable>
</resources>
main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:offess="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.baway.test.huadonganniu.MainActivity"
tools:ignore="ResAuto">
<com.baway.test.huadonganniu.view.MyToggleButton
android:id="@+id/mytoggle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
offess:mybackgroud="@drawable/slide_background2"
offess:myicon= "@drawable/slide_icon2"
offess:mytogglestate= "false"
></com.baway.test.huadonganniu.view.MyToggleButton>
</RelativeLayout>