日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android自定义控件入门实践之雷达扫描控件

發布時間:2024/7/5 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android自定义控件入门实践之雷达扫描控件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以前因為工作的關系,對于自定義控件用的少之又少,無非就是把幾個控件放置到ViewGroup內部,然后提供開放方法,就成了一個所謂的自定義控件,但是這種小伎倆太簡單,面試的時候這點東西根本Hold不住場,所以工作之余還是得把這塊補補,也好加深一下對控件的理解。

好,啰嗦了挺多的,我們先看一下實現的效果:


只是截取了一部分運行時圖,這個控件只是重寫了onDraw方法,其它一一保留給View,簡單說一下這個的實現方式:

使用一只畫筆用來畫等距的四個圓,使用另外一只畫筆畫一個標準的角度漸變圖。

Android提供了標準的漸變圖,同樣在PhotoShop中我們一樣可以找到這些漸變圖,這樣一來,我們就可以根據UI設計師設計的套路來做同樣的效果了:


線性漸變圖


徑向漸變圖


菱形漸變圖


角度漸變圖


對稱漸變圖

好了,我們將這些基本的圖繪制出來之后,它還是個靜態的,我們需要將它動起來,那怎么使它動起來呢,對,我們需要線程來驅動它進行重繪,需要注意的是,線程一定要出口。

開啟線程有兩種方式,一種是傳統的開線程的方式,使用Thread。另一種則使用向主線程消息隊列中發送消息來驅動。我們使用第二種:hander.postRunnable。

來貼一下整體的代碼:

import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Shader; import android.graphics.SweepGradient; import android.util.AttributeSet; import android.view.View;/*** 雷達顯示控件* Created by Sahadev on 2015/12/29.* 郵箱:sahadev@foxmail.com*/ public class RadarView extends View implements Runnable {private boolean threadFlag = true;private int rotate = 0;//用于畫圓的畫筆private Paint circlePaint;//用于畫掃描圖像private Paint shaderPaint;//獲得用于畫圓的坐標位置以及半徑int x, y;//設置掃描圖像的坐標矩陣Matrix matrix = new Matrix();//用于繪制掃描圖像Shader mShader;public RadarView(Context context) {this(context, null);}public RadarView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);//為了避免在onDraw中重復創建對象,所以將一些初始化工作放入構造方法中來做circlePaint = new Paint();circlePaint.setColor(Color.WHITE);//設置畫筆的寬度circlePaint.setStrokeWidth(1);//設置抗鋸齒模式circlePaint.setAntiAlias(true);circlePaint.setFlags(Paint.ANTI_ALIAS_FLAG);//設置畫筆風格circlePaint.setStyle(Paint.Style.STROKE);shaderPaint = new Paint();shaderPaint.setAntiAlias(true);shaderPaint.setFlags(Paint.ANTI_ALIAS_FLAG);//設置畫筆風格為填充模式shaderPaint.setStyle(Paint.Style.FILL);postDelayed(this, 100);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//計算圓的坐標值及半徑y = getMeasuredHeight() / 2;x = getMeasuredWidth() / 2;//為矩陣設置旋轉坐標matrix.setRotate(rotate, x, y);//為了避免重復創建對象,則使用這種方式if (mShader == null)mShader = new SweepGradient(x, y, Color.TRANSPARENT, Color.BLUE);mShader.setLocalMatrix(matrix);shaderPaint.setShader(mShader);//畫一個掃描圖像canvas.drawCircle(x, y, x, shaderPaint);//畫四個等距圓canvas.drawCircle(x, y, x, circlePaint);canvas.drawCircle(x, y, x / 2, circlePaint);canvas.drawCircle(x, y, x / 4 * 3, circlePaint);canvas.drawCircle(x, y, x / 4, circlePaint);}@Overridepublic void run() {if (threadFlag) {rotate++;postInvalidate();//如果到了360度,則重新開始rotate = rotate == 360 ? 0 : rotate;//一秒延遲這個任務postDelayed(this, 1);}}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();//停止循環threadFlag = false;}}
好,這樣運行起來就是我們圖例所顯示的樣子,最后看一下內存使用以及CPU使用情況:


都不是很多,這只是最基本的,我們還可以將它進一步的優化。


有什么疑問歡迎留言討論。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Android自定义控件入门实践之雷达扫描控件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。