天天看點

android 拖動按鈕

首先效果圖:

android 拖動按鈕

然後是分别建立三個檔案,第一個是main.class,第二個是SlipButton.class,第三個是 onchangeListener.class

main.class

import Android.app.Activity;  

import Android.os.Bundle;  

import Android.widget.Toast;  

public class Main extends Activity implements OnChangedListener {  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

        SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);//獲得指定控件   

        myBtn.SetOnChangedListener(this);//為控件設定監聽器   

    }  

    public void OnChanged(boolean CheckState) {//當按鈕狀态被改變時   

        // TODO Auto-generated method stub   

        if(CheckState)  

            Toast.makeText(this,"打開了..." , Toast.LENGTH_SHORT).show();  

        else  

            Toast.makeText(this,"關閉了..." , Toast.LENGTH_SHORT).show();  

SlipButton.class

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.graphics.Rect;  

import Android.util.AttributeSet;  

import Android.view.MotionEvent;  

import Android.view.View;  

import Android.view.View.OnTouchListener;  

public class SlipButton extends View implements OnTouchListener{  

    private boolean NowChoose = false;//記錄目前按鈕是否打開,true為打開,flase為關閉   

    private boolean OnSlip = false;//記錄使用者是否在滑動的變量   

    private float DownX,NowX;//按下時的x,目前的x,   

    private Rect Btn_On,Btn_Off;//打開和關閉狀态下,遊标的Rect   

    private boolean isChgLsnOn = false;  

    private OnChangedListener ChgLsn;  

    private Bitmap bg_on,bg_off,slip_btn;  

    public SlipButton(Context context) {  

        super(context);  

        // TODO Auto-generated constructor stub   

        init();  

    public SlipButton(Context context, AttributeSet attrs) {  

        super(context, attrs);  

        // TODO Auto-generated constructor stub   

    private void init(){//初始化   

        //載入圖檔資源   

        bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_on);  

        bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_off);  

        slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.slip_btn);  

        //獲得需要的Rect資料   

        Btn_On = new Rect(0,0,slip_btn.getWidth(),slip_btn.getHeight());  

        Btn_Off = new Rect(  

                bg_off.getWidth()-slip_btn.getWidth(),  

                0,  

                bg_off.getWidth(),  

                slip_btn.getHeight());  

        setOnTouchListener(this);//設定監聽器,也可以直接複寫OnTouchEvent   

    protected void onDraw(Canvas canvas) {//繪圖函數   

        super.onDraw(canvas);  

        Matrix matrix = new Matrix();  

        Paint paint = new Paint();  

        float x;  

        {  

            if(NowX<(bg_on.getWidth()/2))//滑動到前半段與後半段的背景不同,在此做判斷   

                canvas.drawBitmap(bg_off,matrix, paint);//畫出關閉時的背景   

            else  

                canvas.drawBitmap(bg_on,matrix, paint);//畫出打開時的背景   

            if(OnSlip)//是否是在滑動狀态,   

            {  

                if(NowX >= bg_on.getWidth())//是否劃出指定範圍,不能讓遊标跑到外頭,必須做這個判斷   

                    x = bg_on.getWidth()-slip_btn.getWidth()/2;//減去遊标1/2的長度...   

                else  

                    x = NowX - slip_btn.getWidth()/2;  

            }else{//非滑動狀态   

                if(NowChoose)//根據現在的開關狀态設定畫遊标的位置   

                    x = Btn_Off.left;  

                    x = Btn_On.left;  

            }  

        if(x<0)//對遊标位置進行異常判斷...   

            x = 0;  

        else if(x>bg_on.getWidth()-slip_btn.getWidth())  

            x = bg_on.getWidth()-slip_btn.getWidth();  

        canvas.drawBitmap(slip_btn,x, 0, paint);//畫出遊标.   

        }  

    public boolean onTouch(View v, MotionEvent event) {  

        switch(event.getAction())//根據動作來執行代碼   

        case MotionEvent.ACTION_MOVE://滑動   

            NowX = event.getX();  

            break;  

        case MotionEvent.ACTION_DOWN://按下   

        if(event.getX()>bg_on.getWidth()||event.getY()>bg_on.getHeight())  

            return false;  

            OnSlip = true;  

            DownX = event.getX();  

            NowX = DownX;  

        case MotionEvent.ACTION_UP://松開   

            OnSlip = false;  

            boolean LastChoose = NowChoose;  

            if(event.getX()>=(bg_on.getWidth()/2))  

                NowChoose = true;  

                NowChoose = false;  

            if(isChgLsnOn&&(LastChoose!=NowChoose))//如果設定了監聽器,就調用其方法..   

                ChgLsn.OnChanged(NowChoose);  

        default:  

        invalidate();//重畫控件   

        return true;  

    public void SetOnChangedListener(OnChangedListener l){//設定監聽器,當狀态修改的時候   

        isChgLsnOn = true;  

        ChgLsn = l;  

onchangeListener.class

package CMD100.demo.slipButton;  

public interface OnChangedListener {  

    abstract void OnChanged(boolean CheckState);  

main.xml代碼

<?xml version="1.0" encoding="utf-8"?>  

    Android:orientation="vertical"  

    Android:layout_width="fill_parent"  

    Android:layout_height="fill_parent"  

    >  

<TextView    

    Android:layout_width="fill_parent"   

    Android:layout_height="wrap_content"   

    Android:text="@string/hello"  

    />  

<LinearLayout  

    Android:orientation = "horizontal"  

    Android:layout_width = "fill_parent"  

    Android:layout_height = "wrap_content"  

    Android:background = "#ff0000"  

    <TextView  

        Android:text = "測試:"  

        Android:layout_width = "wrap_content"  

        Android:layout_height = "wrap_content"  

        />  

    <CMD100.demo.slipButton.SlipButton  

        Android:id = "@+id/slipBtn"  

        Android:layout_width="wrap_content"   

        Android:layout_height="wrap_content"  

        Android:layout_marginLeft = "10sp"   

</LinearLayout>  

</LinearLayout> 

注意:在xml裡頭要放置的位置

<[包名].SlipButton

        Android:id = "@+id/slipBtn"

        Android:layout_width="wrap_content"

        Android:layout_height="wrap_content"

        />

然後可以像其他控件一樣使用了...

SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);

myBtn.SetOnChangedListener(...);

繼續閱讀