自定義可滑動導航欄

package my.navilayout;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.LinearLayout;

public class NaviLayout extends LinearLayout {
    private String TAG = "NaviLayout";
    private int SPEED = 50;
    private Context mContext;
    private Rect mNowRect;
    private Rect mEndRect;
    private int mPostion;
    private BitmapDrawable mSelecter;

    public NaviLayout(Context context) {
        this(context, null);
    }

    public NaviLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.d(TAG, "NaviLayout");
        init(context);
    }

    private void init(Context context) {
        Log.d(TAG, "init");
        mContext = context;
        mSelecter = new BitmapDrawable(BitmapFactory.decodeResource(
                mContext.getResources(), R.drawable.selected_line));
        mNowRect = new Rect();
        mEndRect = new Rect();
        mPostion = 0;
        //調用這個接口,可以不設置背景,也可以讓系統調用onDraw
        setWillNotDraw(false);
    }

    protected void onLayout(boolean paramBoolean, int paramInt1, int paramInt2,
            int paramInt3, int paramInt4) {
        super.onLayout(paramBoolean, paramInt1, paramInt2, paramInt3, paramInt4);
        Log.d(TAG, "onLayout");
        getChildAt(0).getHitRect(mNowRect);
        getChildAt(0).getHitRect(mEndRect);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.d(TAG, "onMeasure");
    }

    public int getPosition() {
        return mPostion;
    }

    public void moveLeft() {
        if (mPostion > 0) {
            mPostion--;
            getChildAt(mPostion).getHitRect(mEndRect);
            postInvalidate();
        }
    }

    public void moveTo(int pos) {
        if (pos < 0 || pos > getChildCount() - 1) {
            return;
        }
        mPostion = pos;
        getChildAt(pos).getHitRect(mEndRect);
        postInvalidate();
    }

    public void moveRight() {
        if (mPostion < getChildCount() - 1) {
            mPostion++;
            getChildAt(mPostion).getHitRect(mEndRect);
            postInvalidate();
        }
    }

    // 對於vievgroup需要設置一個背景,纔會調用onDraw
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d(TAG, "onDraw");
        if (mNowRect.right > mEndRect.right) {
            mNowRect.left -= SPEED;
            mNowRect.right -= SPEED;
            if (mNowRect.right <= mEndRect.right) {
                mNowRect.right = mEndRect.right;
                mNowRect.left = mEndRect.left;
            }
            postInvalidateDelayed(50);
        } else if (mNowRect.right < mEndRect.right) {
            mNowRect.left += SPEED;
            mNowRect.right += SPEED;
            if (mNowRect.right >= mEndRect.right) {
                mNowRect.right = mEndRect.right;
                mNowRect.left = mEndRect.left;
            }
            postInvalidateDelayed(50);
        }
        mSelecter.setBounds(mNowRect);
        mSelecter.draw(canvas);
    }

}

源碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章