豎直(垂直)VerticalSeekBar和VerticalProgressBar

        最近想做個豎直(垂直)VerticalSeekBar和VerticalProgressBar,網上雖然用現成的例子,但發現兩個問題,修改下與大家分享下:

         1.有個bug:在拖動的時候沒問題,當調用setProgress()時,滑塊移動不跟着進度條移動,因此又重寫了下setProgress()方法;

         2.需要注意的問題:由於豎直的VerticalSeekBar是SeekBar的一個重寫,交換了寬高,在用的時候發現滑塊滑到頭的時候就蓋住了一點,不美觀,因此,按正常思維去設置paddingBottom和paddingTop結果發現沒效果,後來突然想到,是繼承的是SeekBar,將其立起來,所以應該是反的,設置paddingLeft和paddingRight纔對。

          代碼如下:

package com.custom.ui;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.SeekBar;
/**
 * 豎值SeekBar
 * 參考一下網上的例子,但是有個bug和一個需要注意的點
 * 1.bug:拖動的時候沒問題,當調用setProgress()時,滑塊移動不跟進度條移動
 * 2.注意:因爲豎直seekbar是交換了寬高,所以設置padding時,設置 android:paddingLeft="20dp"
 *        android:paddingRight="20dp",實際是設置bottom和top的padding。所以要想設置底部
 *        和上部的寬高就設置左右padding,解決滑塊顯示不全問題。
 * @author malong
 *
 */
public class MLVerticalSeekBar extends SeekBar{

	public MLVerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

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

	public MLVerticalSeekBar(Context context) {
		super(context);
	}

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(h, w, oldh, oldw);
    }

	@Override
	protected synchronized void onDraw(Canvas canvas) {
		canvas.rotate(-90);
		canvas.translate(-getHeight(), 0);
		super.onDraw(canvas);
	}

	@Override
	protected synchronized void onMeasure(int widthMeasureSpec,
			int heightMeasureSpec) {
		super.onMeasure(heightMeasureSpec,widthMeasureSpec );
		setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()+100);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		
		if(!isEnabled()){
			return false;
		}
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN :
		case MotionEvent.ACTION_MOVE :
		case MotionEvent.ACTION_UP :
			setProgress(getMax()-(int) (getMax() * event.getY() / getHeight()));
			onSizeChanged(getWidth(), getHeight(), 0, 0);
			break;

		case MotionEvent.ACTION_CANCEL:
			break;
		}
		
		return true;
	}

	//解決調用setProgress()方法時滑塊不跟隨的bug
	@Override
	public synchronized void setProgress(int progress) {
		super.setProgress(progress);
		onSizeChanged(getWidth(), getHeight(), 0, 0);
		
	}
			

}

       後來,做一個設置聲音的小demo,可以在後臺播放音樂時,運行demo,調節音量,下載地址:http://download.csdn.net/detail/itjianghuxiaoxiong/8147913
發佈了28 篇原創文章 · 獲贊 89 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章