Android滑动开关-ToggleButton

我们先看下滑动开关的效果图:

我们先上代码:

这里是自定义控件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,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。