我们先看下滑动开关的效果图:
我们先上代码:
这里是自定义控件ToggleButton.java:
package com.fay.toggle;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
* toggle the status
* @since 2014/05/22
* @author Fay
* {@link [email protected]}
*/
public class ToggleButton extends View {
private String TAG = "ToggleButton";//the bitmap of toggle on
private Bitmap backgroudBitmap = null;//the bitmap of toggle flip
private Bitmap slidingBitmap = null;//whether is button if is Sliding
private boolean isSliding = false;//the previous state of the button
private boolean previousState = false;private Paint mPaint = new Paint();
private Matrix mMatrix = new Matrix();
private OnToggleStateChangedListener mOnToggleStateChangedListener = null;
//current X-Location which touched
private float touchXLocation = 0;//the slidingBitmap inner margin the ToggleButton
private float marginLeft = 0;public ToggleButton(Context context) {
super(context);
}
public ToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}/**
* set the background for the ToggleButton and sliding image resource
* @param int backgroudResID
* @param int flipResID
*/
public void setImageResource(int backgroudResID, int flipResID) {
backgroudBitmap = BitmapFactory.decodeResource(getResources(), backgroudResID);
slidingBitmap = BitmapFactory.decodeResource(getResources(), flipResID);
}/**
* set the initialize state of the view
* @param boolean isOn
*/
public void setInitState(boolean isOn) {
previousState = isOn;
}@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(backgroudBitmap, mMatrix, mPaint);
if (isSliding) {//if sliding
//to avoid slidingBitmap sliding out of the ToggleButton
if (touchXLocation >= backgroudBitmap.getWidth() - slidingBitmap.getWidth() /2
|| touchXLocation <= slidingBitmap.getWidth() /2) {if (touchXLocation >= backgroudBitmap.getWidth() - slidingBitmap.getWidth() /2) {
marginLeft = backgroudBitmap.getWidth() - slidingBitmap.getWidth();
} else {
marginLeft = 0;
}
} else {
marginLeft = touchXLocation - slidingBitmap.getWidth() / 2;
}
canvas.drawBitmap(slidingBitmap, marginLeft, 0, mPaint);
} else {
if (previousState == true) {//on
canvas.drawBitmap(slidingBitmap, backgroudBitmap.getWidth() - slidingBitmap.getWidth(), 0, mPaint);
} else {
canvas.drawBitmap(slidingBitmap, 0, 0, mPaint);
}
}
super.onDraw(canvas);
}@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (0 <= event.getX() && event.getX() <= backgroudBitmap.getWidth()
&& 0 <= event.getY() && event.getY() <= backgroudBitmap.getHeight() ) {
touchXLocation = event.getX();
isSliding = true;
} else {
isSliding = false;
}
break;
case MotionEvent.ACTION_MOVE:
if (isSliding) {//to avoid change the state out of the toggle
touchXLocation = event.getX();
}
break;
case MotionEvent.ACTION_UP:
isSliding = false;
if (touchXLocation > backgroudBitmap.getWidth() / 2) {//on
//if previous state is off
if (previousState == false) {
mOnToggleStateChangedListener.changed(true);
previousState = true;
}
} else if (touchXLocation < backgroudBitmap.getWidth() / 2) {//off
//if previous state if on
if (previousState == true) {
mOnToggleStateChangedListener.changed(false);
previousState = false;
}
}
break;
}
invalidate();
return true;
}/**
* The Listener of this ToggleButton
*/
public interface OnToggleStateChangedListener {
void changed(boolean isOn);
}/**
* set the Listener for the ToggleButton
*/
public void setOnStateChangedListener(OnToggleStateChangedListener mOnToggleStateChangedListener) {
this.mOnToggleStateChangedListener = mOnToggleStateChangedListener;
}}
然后我们看下这个活动的布局activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" ><com.fay.toggle.ToggleButton
android:id="@+id/toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp" >
</com.fay.toggle.ToggleButton></RelativeLayout>
然后我们这个活动对这个控件的使用MainActivity.java
package com.fay.toggle;import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;import com.fay.toggle.ToggleButton.OnToggleStateChangedListener;
public class MainActivity extends Activity {
private ToggleButton mToggleButton = null;@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToggleButton = (ToggleButton) findViewById(R.id.toggle);
mToggleButton.setInitState(false);
mToggleButton.setImageResource(R.drawable.bkg_switch, R.drawable.btn_slip);
mToggleButton.setOnStateChangedListener(new OnToggleStateChangedListener() {
@Override
public void changed(boolean isOn) {
Toast.makeText(getApplicationContext(), isOn + "", 2000).show();
}
});
}}
各位朋友可以看到,在MainActivity.java中对ToggleButton的使用是十分简单方便.这个控件通过集成View,重写里面的onDraw()方法进行绘图.以及设置监听器.由于用法十分简单,我就不需要啰嗦了.其中有不妥之处,希望各位道友及时给我您宝贵的建议!
Android滑动开关-ToggleButton,布布扣,bubuko.com