1. 程式人生 > >android 自定義view 之 動態音訊圖 (二)

android 自定義view 之 動態音訊圖 (二)

還是和上一篇一樣,先上效果圖


這次要比上次難了點,

首先我們把自定義檔案貼上

/**
 * 作者:chengxiangtong on 2016/11/10 14:44
 * 郵箱:[email protected]
 * 仿音訊條
 */
public class AudioView extends View {
    privateRandom mttt = new Random();
private Paint mPaint;  
private int width;    
private int height;    
private int mRectWidth = 10;    
private int mRectHeight = 60;   
private int offset = 3;//每次畫之前的左邊距離   
public AudioView(Context context, AttributeSet attrs, int defStyleAttr) {        
super(context, attrs, defStyleAttr);        init();    }    public AudioView(Context context) {        this(context, null);    }    public AudioView
(Context context, AttributeSet attrs) { this(context, attrs, 0); } private void init() { mPaint = new Paint(); } @Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas);//獲取paddingint left = getPaddingLeft(); int top = getPaddingTop(); int right
= getPaddingRight(); int bottom = getPaddingBottom(); width = getMeasuredWidth() - left - right; height = getMeasuredHeight() - top - bottom; int mRectCount = 0; for (int count = 5; count < width; count += mRectWidth) { mRectCount++; } for (int i = 0; i < mRectCount; i++) { double mRandom = Math.random();
    //隨機數產生各種畫筆的顏色,當然你也可以在初始化的時候固定一種顏色
int n = mttt.nextInt(4); if (n == 0) { mPaint.setColor(Color.BLUE); } else if (n == 1) { mPaint.setColor(Color.RED); } else if (n == 2) { mPaint.setColor(Color.LTGRAY); } else { mPaint.setColor(Color.GREEN); } mRectHeight = (int) (mRandom * height);//獲取每次隨機的高度canvas.drawRect(offset + mRectWidth * i, mRectHeight, mRectWidth * (i + 1), height, mPaint); } postInvalidateDelayed(500);//每間隔500ms重新整理一次,這樣才有動的效果 } @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthsize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST) { setMeasuredDimension(getMeasuredWidth() / 2, getMeasuredHeight() / 2); } else if (widthMode == MeasureSpec.AT_MOST) { setMeasuredDimension(getMeasuredWidth() / 2, heightSize); } else if (heightMode == MeasureSpec.AT_MOST) { setMeasuredDimension(widthsize, getMeasuredHeight() / 2); } }} 這個主要說說onMeasure()這個方法,這個是來測試佈局的,下面就是他的全部意思啦:

onMeasure傳入的兩個引數是由上一層控制元件傳入的大小,有多種情況,重寫該方法時需要對計算控制元件的實際大小,然後呼叫setMeasuredDimension(int, int)設定實際大小。

onMeasure傳入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸數值,而是將模式和尺寸組合在一起的數值。我們需要通過int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size = MeasureSpec.getSize(widthMeasureSpec)得到尺寸。

mode共有三種情況,取值分別為MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。

MeasureSpec.EXACTLY是精確尺寸,當我們將控制元件的layout_width或layout_height指定為具體數值時如andorid:layout_width="50dip",或者為FILL_PARENT是,都是控制元件大小已經確定的情況,都是精確尺寸。

MeasureSpec.AT_MOST是最大尺寸,當控制元件的layout_width或layout_height指定為WRAP_CONTENT時,控制元件大小一般隨著控制元件的子空間或內容進行變化,此時控制元件尺寸只要不超過父控制元件允許的最大尺寸即可。因此,此時的mode是AT_MOST,size給出了父控制元件允許的最大尺寸。

MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控制元件是AdapterView,通過measure方法傳入的模式。

所以你現在對於這段程式碼就不陌生了

if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(getMeasuredWidth() / 2, getMeasuredHeight() / 2);
        } else if (widthMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(getMeasuredWidth() / 2, heightSize);
        } else if (heightMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(widthsize, getMeasuredHeight() / 2);
        }

分別表示什麼自己對照就好了微笑,在佈局中直接呼叫就可以啦,不在給貼布局啦,實在是不好意思,浪費時間呀,有沒有發現比第一篇還簡單呀,自己可以執行看看啦

github地址:https://github.com/xiangtongcheng/customerView

相關推薦

android 定義view 動態音訊 ()

還是和上一篇一樣,先上效果圖 這次要比上次難了點, 首先我們把自定義檔案貼上 /** * 作者:chengxiangtong on 2016/11/10 14:44 * 郵箱:[email protected] * 仿音訊條 */ public cl

Android定義View分貝儀

一、說明        最近在整理自定義View方面的知識,偶爾看到meizu工具箱的分貝儀效果,感覺它的實效效果還挺好的,遂想自己模擬實現練練手,廢話不多說,直接開擼。 二、效果圖 首先看一下效果圖: 看效果還挺炫酷

Android定義ViewCanvas

https://www.jianshu.com/p/fb18c28d6627 用繼承View的方式來自定義View,我們就需要重寫onDraw方法,也就是得咱自己來畫圖了。畫圖就得用到畫筆和畫布,也就是Paint和Canvas。我們來了解下Canvas。 Canvas Canvas我們可

Android 定義ViewCanvas詳解

自定義View的相關文章: Android 實現一個簡單的自定義View Android 自定義View步驟 Android Paint詳解 Android 自定義View之Canvas相關方法說明 Android 自定義View例項之 “京東跑”

Android : 定義View流式佈局

寫了一個很簡單的佈局 這是周圍圓框的drawable <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

android定義View仿通訊錄側邊欄滑動,實現A-Z字母檢索

我們的手機通訊錄一般都有這樣的效果,如下圖: OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。 一.概述 1.頁面功能分析 整體上來說,左邊是一個ListView,右邊是一個自定義View,但

Android定義ViewgetTextBounds()

在Android自定義View的過程中一定會用到Paint,而paint屬性中有一個方法getTextBounds(String text,int start,int end,Rext bounds),它的中文解釋是:返回一個包含中文的矩形邊界,位置為(start,end) 英文解釋:Retur

Android定義View定義屬性

在Android開發中經常會用到自定義View的情況,而在自定義View時,自定義屬性是必須用到的。 1、新建一個自定義View如CustomView 它的自定義屬性主要是通過declare-styleable標籤為其配置自定義屬性。具體做法是:在res/values/目錄下增加一個reso

Android -- 定義viewStepView

先看看實現的效果: 2,首先我們來看看我們常規的自定義view的基礎步驟吧         1,繼承View,重寫構造方法 2,自定義屬性 3,重寫onMeasure()測量控制元件高度 4,重寫onDra

Android 定義View 可隨意拖動的View

因為趕專案本人停更兩個月 從今天開始又可以更新了 今天說一下這個可隨意拖動的view 簡單說一下這個view效果 和 發展 一開始這種效果是使用在網頁端的特別是購物類 例如某寶 某東 購物車和客服視窗 都有使用這個懸浮可拖動的設計效果 後來才發展到的移動端 還有

Android 定義View咖啡動畫

文章目錄效果畫杯子畫杯墊畫煙霧 效果 大概思路 自定義view,直接繼承view 複寫onSizeChanged()方法,在此計算杯墊,杯子,煙霧效果的path 在onDraw()方法中,描繪杯墊,杯子 處理煙霧動畫效果 畫杯子 這裡需要畫兩部分內容,第

Android 定義View下雨動畫

文章目錄效果思路畫雲畫雨滴優化 效果 開始前先做個熱身( ˘•灬•˘ ) 自己實現比較容易,但是到了要出部落格整理思路,總結要點的時候就撓頭,不知雲所以,所以最簡單的還是 如果對安卓UI有興趣的朋友可以加我好友互相探討, 思路 思路比較簡單,整個view無

android定義View定義EditText(新增刪除功能)

           忙忙碌碌20天,新的專案終於接近尾聲了。今天公司召集幾個使用者體驗師和美工一起吐糟這20天做的這個新產品,對於產品提出了很多建議,這幾天就改介面了。在這個專案中大量的使用了EditText元件,並且添加了刪除功能。這裡面都是用RelativeLayou

android定義view畫圓隨著手指移動

public class MyView extends View { private Paint mFanPaint,mTextPaint;//扇形畫筆和文字畫筆 public float AxisX=100; public float AxisY=100; public MyView(

Android定義view實現帶checkbox的Snackbar

前言 最近專案要求實現一個類似於snackbar功能,但是又不完全是snackbar的外掛,本來想在Google提供的snackbar裡面進行更改,但是這樣太麻煩了,於是自己動手實現了一個snackbar。先看下效果圖: 1.要解決的問題 1.彈框裡面除了文字提示之外還有一個按鈕,這個按

android定義View3D索引效果

效果圖: 我的小霸王太卡了。 最近工作比較忙,今天搞了一下午才搞出來這個效果,這種效果有很多種實現方式,最常見的應該是用貝塞爾曲線實現的。今天我們來看另一種不同的實現方式,只需要用到 canvas.scale(),有沒有很好奇是怎麼實現的呢。 首先來說一下思路,只要有了思

android 定義view側滑效果

效果圖: 看網上的都是兩個view拼接,預設右側的不顯示,水平移動的時候把右側的view顯示出來。但是看最新版QQ上的效果不是這樣的,但給人的感覺卻很好,所以獻醜來一發比較高仿的。 知識點: 1、ViewDragHelper 的用法; 2、滑動衝突的解決; 3、自定

android 定義view選座功能

效果圖: 介面比較粗糙,主要看原理。 這個介面主要包括以下幾部分 1、座位 2、左邊的排數 3、左上方的縮圖 4、縮圖中的紅色區域 5、手指移動時跟隨移動 6、兩個手指縮放時跟隨縮放 主要技術點 1、矩陣Matrix 2、GestureDetector與S

Android定義View實現簡單炫酷的球體進度球

前言 最近一直在研究自定義view,正好專案中有一個根據下載進度來實現球體進度的需求,所以自己寫了個進度球,程式碼非常簡單。先看下效果: 效果還是非常不錯的。 準備知識 要實現上面的效果我們只要掌握兩個知識點就好了,一個是Handler機制,用於發訊息重新整理我們的進度球,一個是clip

從零開始學Android定義View動畫系列——屬性動畫(3)

屬性動畫對補間動畫進行了很大幅度的改進,之前補間動畫可以做到的屬性動畫也能做到,補間動畫做不到的現在屬性動畫也可以做到了。因此,今天我們就來學習一下屬性動畫的高階用法,看看如何實現一些補間動畫所無法實現的功能。 ValueAnimator的高階用法 補間