自訂音量大小控制項的實現

來源:互聯網
上載者:User

標籤:控制項   介面   音量大小   自訂控制項   

本篇文章,將介紹如何?自訂的音量大小控制項。

話不多少,先看


本篇文章將介紹兩種實現的方式,上面的是通過繼承RatingBar,然後設定樣式獲得的效果,下面的是通過繼承自View,完全自訂的方式實現。

我們首先介紹第一種方式,也就是繼承自RatingBar實現。

public class WmtRatingBar extends RatingBar {    private OnRatingBarChanging mOnRatingBarChanging;    public WmtRatingBar(Context context) {        super(context);    }    public WmtRatingBar(Context context, AttributeSet attrs) {        super(context, attrs);    }    public WmtRatingBar(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }            @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_MOVE:            case MotionEvent.ACTION_DOWN:            case MotionEvent.ACTION_UP:                if (mOnRatingBarChanging != null)                    mOnRatingBarChanging.onRatingChanging(this.getRating());                break;        }        return super.onTouchEvent(event);    }    public void setOnRatingBarChange(OnRatingBarChanging changing) {        mOnRatingBarChanging = changing;    }    public interface OnRatingBarChanging {        void onRatingChanging(float f);    }}
我們可以看到,實現方式很簡單,只不過是增加了一個介面,方便擷取變化值。如果我們在布局檔案中需要使用的話,需要這樣

<com.wike.volume.WmtRatingBar            android:id="@+id/volume_ratingBar"            style="@style/wmtRatingBar"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_vertical"            android:numStars="15"            android:paddingBottom="20dip"            android:paddingTop="20dip" >        </com.wike.volume.WmtRatingBar>
這裡很重要的一個就是設定style,我們看一下在style中是如何設定的

<resources>    <style name="wmtRatingBar" parent="@android:style/Widget.RatingBar">        <item name="android:progressDrawable">@drawable/wmt_ratingbar</item>        <item name="android:minHeight">16dip</item>        <item name="android:maxHeight">16dip</item>    </style></resources>
這裡最重要的一個屬性就是progressDrawable,這裡定義了一個檔案用於設定選中和不選中的圖片顯示,替代內建的五角星圖形。

在wmt_ratingbar.xml中是這樣設定的

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+android:id/background" android:drawable="@drawable/ratingbar_off"></item><item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/ratingbar_off"></item><item android:id="@+android:id/progress" android:drawable="@drawable/ratingbar_on"></item></layer-list>
在這裡面設定了背景和選中時的圖片顯示。

通過設定這麼多東西之後,我們就可以實現一開始顯示出的上面那種效果,精度可以達到0.5


第一種實現方式比較簡單,但是各種東西設定起來也是比較的繁瑣,因此,我對第一種方案進行了修改,直接繼承自View,然後完全自訂音頻調節控制項,下面看實現代碼

/** * 自訂音量顯示控制項 *  * @author zhaokaiqiang *  * @time 2014年6月25日 上午11:42:10 */public class VolumeView extends View {private static final String TAG = "VolumeView";// 增加音量圖片private Bitmap addBitmap;// 減少音量圖片private Bitmap reduceBitmap;// 小喇叭圖片private Bitmap volume;private Paint paint = new Paint();// 控制項高度private int height = 100;// 控制項寬度private int width = 430;// 最大音量private int MAX = 15;// 兩個音量矩形最左側之間的間隔private int rectMargen = 15;// 音量矩形高private int rectH = 20;// 音量矩形寬private int recW = 10;// 當前選中的音量private int current = 0;// 最左側音量矩形距離控制項最左側距離private int leftMargen = 0;public VolumeView(Context context) {super(context);init();}public VolumeView(Context context, AttributeSet attrs) {super(context, attrs);init();}public VolumeView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {addBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.add);volume = BitmapFactory.decodeResource(getResources(), R.drawable.volume);reduceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.reduce);leftMargen = volume.getWidth() + reduceBitmap.getWidth();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 繪製背景顏色paint.setColor(getResources().getColor(R.color.back_color));canvas.drawRect(0, 0, width, height, paint);// 繪製沒有被選中的白色音量矩形paint.setColor(getResources().getColor(R.color.whrite));for (int i = current; i < MAX; i++) {canvas.drawRect(leftMargen + (i + 2) * rectMargen, (height - rectH) / 2, leftMargen + (i + 2) * rectMargen + recW, (height - rectH) / 2 + rectH,paint);}// 繪製被選中的橘黃色音量矩形paint.setColor(getResources().getColor(R.color.orange));for (int i = 0; i < current; i++) {canvas.drawRect(leftMargen + (i + 2) * rectMargen, (height - rectH) / 2, leftMargen + (i + 2) * rectMargen + recW, (height - rectH) / 2 + rectH,paint);}// 繪製音量圖片canvas.drawBitmap(volume, volume.getWidth() / 2, (height - volume.getHeight()) / 2, paint);// 繪製音量減少圖片canvas.drawBitmap(reduceBitmap, reduceBitmap.getWidth() / 2 + volume.getWidth(), (height - reduceBitmap.getHeight()) / 2, paint);// 繪製音量增加圖片canvas.drawBitmap(addBitmap, leftMargen + (MAX + 2) * rectMargen, (height - addBitmap.getHeight()) / 2, paint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_UP:case MotionEvent.ACTION_MOVE:// 當觸摸位置在音量矩形之內時,擷取當前選中的音量矩形數量if ((event.getX() > leftMargen + rectMargen && event.getX() < leftMargen + (MAX + 1) * rectMargen + recW)&& (event.getY() > (height - rectH) / 2 && event.getY() < (height - rectH) / 2 + rectH)) {current = (int) ((event.getX() - (leftMargen)) / (rectMargen)) - 1;if (onChangeListener != null) {onChangeListener.onChange(current);}Log.d(TAG, "current:" + current);}break;}// 通知介面重新整理invalidate();// 攔截觸摸事件return true;}// 高度父布局要佔用的位置大小@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(width, height);}public interface OnChangeListener {public void onChange(int count);}private OnChangeListener onChangeListener;public void setOnChangeListener(OnChangeListener onChangeListener) {this.onChangeListener = onChangeListener;}}
通過這個自訂的類,我們就實現了這個音量大小控制項,下面我們看一下使用方法。

在布局檔案中

 <com.wike.volume.VolumeView        android:id="@+id/volumeView"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />
在Activity中調用

view.setOnChangeListener(new OnChangeListener() {@Overridepublic void onChange(int count) {tv.setText("當前音量:"+count);}});

我們可以看到,這樣使用起來很方便,但是精度暫時只能達到1的程度,而且現在增減音量的圖片還是擺設,暫時沒什麼功能。如果有高手能幫我改進一下,不勝感激!


上面是圖片資源

下面是顏色值

<?xml version="1.0" encoding="utf-8"?><resources>    <color name="back_color">#b0000000</color>    <color name="whrite">#ffffff</color><color name="orange">#FFB90F</color></resources>



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.