Android Shader應(yīng)用開發(fā)之雷達(dá)掃描效果
本文實(shí)例為大家分享了Android雷達(dá)掃描效果的具體代碼,供大家參考,具體內(nèi)容如下
效果圖
知識(shí)點(diǎn)提要
- Shader
- 矩陣matrix
- 屬性動(dòng)畫
ShaderView3
package com.example.apple.shaderdemo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapShader; 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.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; /** * Created by apple on 2017/5/23. * 女神面部掃描 */ public class ShaderView3 extends View { /** * 繪制掃描圈的筆 */ private Paint mSweepPaint; /** * 繪制女神bitmap的筆 */ private Paint mBitmapPaint; /** * 這個(gè)自定義View的寬度,就是你在xml布局里面設(shè)置的寬度(目前不支持) */ private int mWidth; /** * 女神圖片 */ private Bitmap mBitmap; /** * 雷達(dá)掃描旋轉(zhuǎn)角度 */ private int degrees = 0; /** * 用于控制掃描圈的矩陣 */ Matrix mSweepMatrix = new Matrix(); /** * 用于控制女神Bitmap的矩陣 */ Matrix mBitmapMatrix = new Matrix(); /** * 著色器---生成掃描圈 */ private SweepGradient mSweepGradient; /** * 圖片著色器 */ private BitmapShader mBitmapShader; private float mScale; public ShaderView3(Context context) { super(context); init(); } public ShaderView3(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } /** * 屬性動(dòng)畫,必須有setXxx方法,才可以針對這個(gè)屬性實(shí)現(xiàn)動(dòng)畫 * * @param degrees */ public void setDegrees(int degrees) { this.degrees = degrees; postInvalidate();//在主線程里執(zhí)行OnDraw } private void init() { // 1.準(zhǔn)備好畫筆 mSweepPaint = new Paint(); mBitmapPaint = new Paint(); // 2.圖片著色器 mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ccc); mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); // 3.將圖片著色器設(shè)置給畫筆 mBitmapPaint.setShader(mBitmapShader); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 獲取這個(gè)自定義view的寬高,注意在onMeasure里獲取,在構(gòu)造函數(shù)里得到的是0 mWidth = getMeasuredWidth(); // 根據(jù)你所設(shè)置的view的尺寸和bitmap的尺寸計(jì)算一個(gè)縮放比例,否則的話,得到的圖片是一個(gè)局部,而不是一整張圖片 mScale = (float) mWidth / (float) mBitmap.getWidth(); // 4.梯度掃描著色器 mSweepGradient = new SweepGradient(mWidth / 2, mWidth / 2, new int[]{Color.argb(200, 200, 0, 0), Color.argb(10, 30, 0, 0)}, null); // 5.將梯度掃描著色器設(shè)置給另外一支畫筆 mSweepPaint.setShader(mSweepGradient); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 迫不得已的時(shí)候,才在onDraw方法寫代碼,能提前準(zhǔn)備的要在之前去準(zhǔn)備, // 不要寫在onDraw里面,因?yàn)閛nDraw會(huì)不停地刷新繪制,寫的代碼越多,越影響效率 // 將圖片縮放至你指定的自定義View的寬高 mBitmapMatrix.setScale(mScale, mScale); mBitmapShader.setLocalMatrix(mBitmapMatrix); // 設(shè)置掃描圈旋轉(zhuǎn)角度 mSweepMatrix.setRotate(degrees, mWidth / 2, mWidth / 2); mSweepGradient.setLocalMatrix(mSweepMatrix); // 5. 使用設(shè)置好圖片著色器的畫筆,畫圓,先畫出下層的女神圖片,在畫出上層的掃描圖片 canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mBitmapPaint); canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mSweepPaint); } }
外部調(diào)用
package com.example.apple.shaderdemo; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.LinearInterpolator; public class MainActivity extends AppCompatActivity { private ShaderView3 mShaderView; int degrees = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mShaderView = (ShaderView3) findViewById(R.id.sv); mShaderView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ObjectAnimator degrees = ObjectAnimator.ofInt(mShaderView, "degrees", 0, 360); degrees.setInterpolator(new LinearInterpolator()); degrees.setDuration(10000); degrees.setRepeatCount(ValueAnimator.INFINITE); degrees.start(); /* new Thread(new Runnable() { @Override public void run() { while (degrees <= 360) { degrees += 1; mShaderView.setDegrees(degrees); try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); degrees = 0; mShaderView.setDegrees(degrees);*/ } }); } }
XML布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.apple.shaderdemo.MainActivity"> <com.example.apple.shaderdemo.ShaderView3 android:id="@+id/sv" android:layout_width="300dp" android:layout_height="300dp" /> </LinearLayout>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android應(yīng)用中使用ContentProvider掃描本地圖片并顯示
- Android實(shí)現(xiàn)掃描和生成二維碼
- Android實(shí)現(xiàn)掃描二維碼功能
- Android studio 實(shí)現(xiàn)手機(jī)掃描二維碼功能
- Android如何實(shí)現(xiàn)掃描和生成二維碼
- Android銀行卡掃描獲取銀行卡號(hào)
- Android實(shí)現(xiàn)銀行卡號(hào)掃描識(shí)別功能
- Android 6.0 掃描不到 Ble 設(shè)備需開啟位置權(quán)限的方法
- Android手機(jī)(設(shè)備)連接掃描槍掃碼遇到的問題
- Android編程實(shí)現(xiàn)wifi掃描及連接的方法
- Android實(shí)現(xiàn)支付寶AR掃描動(dòng)畫效果
- Android 二維碼掃描和生成二維碼功能
- Android 開機(jī)應(yīng)用掃描相關(guān)總結(jié)
相關(guān)文章
Android Studio實(shí)現(xiàn)幀動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)幀動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Android?Choreographer源碼詳細(xì)分析
Choreographer的作用主要是配合Vsync,給上層App的渲染提供一個(gè)穩(wěn)定的Message處理的時(shí)機(jī),也就是Vsync到來的時(shí)候,系統(tǒng)通過對Vsync信號(hào)周期的調(diào)整,來控制每一幀繪制操作的時(shí)機(jī)2022-08-08Android實(shí)現(xiàn)網(wǎng)易新聞客戶端首頁效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)易新聞客戶端首頁效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11一文帶你了解Android系統(tǒng)的啟動(dòng)流程
Android系統(tǒng)的啟動(dòng)是一個(gè)復(fù)雜的過程,涉及到多個(gè)階段和組件,所以本文將給大家詳細(xì)的介紹一下Android系統(tǒng)的啟動(dòng)流程,文中也有圖片和代碼示例的講解,需要的朋友可以參考下2023-09-09Android入門之系統(tǒng)設(shè)置Configuration類的使用教程
這篇文章主要給大家介紹一下Configuration類的使用,Configuration類是用來描述手機(jī)設(shè)備的配置信息的,比如屏幕方向,?觸摸屏的觸摸方式等,感興趣的可以了解一下2022-12-12android底部彈出iOS7風(fēng)格對話選項(xiàng)框(QQ對話框)--第三方開源之IOS_Dialog_Library
這篇文章主要介紹了android底部彈出iOS7風(fēng)格對話選項(xiàng)框(QQ對話框)--第三方開源--IOS_Dialog_Library的相關(guān)資料,需要的朋友可以參考下2015-11-11Android資源文件與層次式導(dǎo)航超詳細(xì)講解
這篇文章主要介紹了Android資源文件與層次式導(dǎo)航,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12