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