SeekBar禁止點擊

SeekBar禁止點擊

項目有個需求是Seekbar禁止點擊 只能拖動。本來想直接 網上找找 看有什麼直接設置的方法,但是找了一圈下來又看了源碼,發現原生的Seekbar沒有提供相應的API。沒辦法只能通過自定義了。
要準備的知識點:
1.事件分發機制
2.滑動的原理

簡單說 事件分發是 自上而下,然後再自下而上。
滑動就是 獲取觸摸點的座標 然後不斷設置控件的位置。

有了這2個知識點就可以開始了。

我們要禁止點擊事件-最簡單的辦法按下的時候判斷:
1.如果是按在了滑塊上,就認爲要進行滑動不處理。
2.如果是按在了滑塊之外,就認爲是點擊事件 就在ontouchEvent() 中return true 消耗掉事件。

還是比較簡單的以下是全部代碼:

/**
 * 
 */
package com.zhonghong.settings.widgets;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.SeekBar;

/**
 * @descriable 可以通過STATUS設置 Seekbar禁止點擊禁止滑動等等
 * 
 */
public class SlideSeekBar extends SeekBar {
	private static final int PADDING_DEFAULT = 50;

	public static enum STATUS {
		STATUS_ENABLE, STATUS_CLICK, STATUS_SLIDE, STATUS_UNABLE
	}

	/** 填充大小 */
	private int mPaddingSize = PADDING_DEFAULT;

	private STATUS mStaus = STATUS.STATUS_ENABLE;

	private Rect mThumbRect;

	private int mX, mY;

	private SlideSeekBar(Context context) {
		super(context);
	}

	public SlideSeekBar(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	private SlideSeekBar(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		if (MotionEvent.ACTION_DOWN == event.getAction()) {
			mThumbRect = getThumb().getBounds();
		}
		mX = (int) event.getX();
		mY = (int) event.getY();

		if (mStaus == STATUS.STATUS_CLICK && !checkBound()) {
			return true;
		}
		if (mStaus == STATUS.STATUS_SLIDE && checkBound()) {
			return true;
		}
		if (mStaus == STATUS.STATUS_UNABLE) {
			return true;
		}
		return super.onTouchEvent(event);
	}

	/**
	 * 判斷當前觸摸點 是否在滑塊之類-mPaddingSize是爲了提高體驗,因爲有些滑塊太小
	 * 
	 * @return
	 */
	private boolean checkBound() {

		if (mX < mThumbRect.left - mPaddingSize
				|| mX > mThumbRect.right + mPaddingSize
				|| mY < mThumbRect.top - mPaddingSize
				|| mY > mThumbRect.bottom + mPaddingSize) {
			return true;
		}
		return false;
	}

	public void setStatus(STATUS status) {
		this.mStaus = status;
	}

}

其實當我們在網上搜索不到我們想要的,或者第一時間沒找到答案。就不要再浪費時間去找來找去了,往往有時候越搜索越煩。這個時候要冷靜下來,自己嘗試去分析解決,這句話也是告訴我自己。

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