Android 自定義圖片進度條

用系統的Progressbar,設置圖片drawable作為進度條會出現圖片長度不好控制,容易被截斷,或者變形的問題。而我有個需求,使用圖片背景,和圖片進度,而且在進度條頭部有個閃光點效果。

如下圖:

1605e545fb19408284eb6b6bda03fd28.jpeg

找了兩個小時,國內外,百度,github搜遍了,全網都沒有找到一個現成的。

最后只好自己寫一個。本來我用自己代碼寫的用顏色值的進度條,很容易就實現了。

產品要用設計師的圖片。誰知道啊,這么個小功能卻這么麻煩,為這么個進度條的功能加班到晚上11點。

package com.alisajidapps.watermarkpdfss.view;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;import com.alisajidapps.watermarkpdfss.R;public class CustomProgressBar extends View {private Paint paint;private Bitmap progressBarImage;private Bitmap backgroundImage;private Bitmap progressPointerBitmap;private Rect srcRect;private Rect dstRect;private int progress;//手機寬度private int screenWidth;private int progressWidth;private int progressHeight;//縮放后的進度條寬度private int progressBarWidthNew;private Rect pointerRect;private Rect pointerDstRect;public CustomProgressBar(Context context) {super(context);init();}public CustomProgressBar(Context context, AttributeSet attrs) {super(context, attrs);init();}public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {paint = new Paint();progressBarImage = BitmapFactory.decodeResource(getResources(), R.drawable.update_progress); // 你的進度條圖片資源backgroundImage = BitmapFactory.decodeResource(getResources(), R.drawable.update_progress_bg); // 你的進度條圖片資源progressPointerBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.update_progress_seek); // 你的進度條圖片資源DisplayMetrics displayMetrics = getResources().getDisplayMetrics();screenWidth = displayMetrics.widthPixels;scale = (float) (screenWidth*0.7/backgroundImage.getWidth());progressWidth =  progressBarImage.getWidth();progressHeight = progressBarImage.getHeight();progressBarWidthNew = (int) (progressBarImage.getWidth()*scale);srcRect = new Rect();dstRect = new Rect();backRect=new Rect();backDstRect=new Rect();pointerRect = new Rect();pointerDstRect = new Rect();progress =10;}public void setProgress(int progress) {this.progress = progress;invalidate(); // 重繪視圖}Rect backRect;Rect backDstRect;float scale;@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Log.e("xxx","scrrenWidth:"+screenWidth);//第一步,畫背景backRect.left =0;backRect.top = 0;backRect.right = backgroundImage.getWidth();backRect.bottom = backgroundImage.getHeight();Log.e("xxx",scale+"");Log.e("xxx","backgroundImageWidth:"+backgroundImage.getWidth()+"");backDstRect.top =20;backDstRect.left = (int) (screenWidth/2 - (backgroundImage.getWidth() * scale/2));backDstRect.right = (int) (screenWidth/2 + (backgroundImage.getWidth() * scale/2));backDstRect.bottom = (int) (backgroundImage.getHeight() * scale)+20;// 繪制縮放后的位圖,dstRect縮放后,畫進去的圖片就是縮放的。canvas.drawBitmap(backgroundImage, backRect, backDstRect, paint);//第二步,畫進度條srcRect.left = 0;srcRect.top = 0;srcRect.right = progressWidth;srcRect.bottom = progressHeight;Log.e("xxx","progressWidth:"+progressWidth);Log.e("xxx","progressHeight:"+progressHeight);Log.e("xxx","progressbarWidth:"+progressBarImage.getWidth());progressWidth = (int) (progressBarWidthNew *progress / 100 ); // 假設進度是0到100//dstRect  等比例縮放了,畫進去的圖片就會等比例縮放dstRect.top =30;dstRect.left = (int) (screenWidth/2 -  progressBarWidthNew/2);dstRect.right = dstRect.left+ progressWidth;dstRect.bottom = (int) (progressBarImage.getHeight() * scale+30);canvas.drawBitmap(progressBarImage, srcRect, dstRect, paint);Log.e("xxx","怎么沒有繪制:"+progressWidth);//第三步,畫進度條前面的指針效果pointerRect.left = 0;pointerRect.top = 0;pointerRect.right = progressPointerBitmap.getWidth();pointerRect.bottom = progressPointerBitmap.getHeight();pointerDstRect.left = dstRect.right-15;pointerDstRect.top = 0;pointerDstRect.right = (int) (dstRect.right+ progressPointerBitmap.getWidth()*scale-15);pointerDstRect.bottom = (int) (progressPointerBitmap.getHeight()*scale);canvas.drawBitmap(progressPointerBitmap,pointerRect,pointerDstRect,paint);}
}

使用時只需要調用setProgressBar就行。

上圖就是代碼實現的效果。

?

知識總結:

1,基本的繪制圖片方法

drawBitmap(Bitmap bitmap, float left, float top, Paint paint)

參數://Bitmap:圖片對象,left:偏移左邊的位置,top: 偏移頂部的位置

?

2, drawBitmap( Bitmap bitmap, Rect src, Rect dst, Paint paint);

?

這里由2個Rect,第一個Rect --src 代表要裁剪的bitmap的區域,如傳null,表示需要繪制整個圖片,

?

第二個Rect ---det表示需要將bitmap,繪制在屏幕上的位置,不可為空,并且大于src則把src的裁截區放大,小于src則把src的裁截區縮小。

?

?Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.ic_logo);

? ? ? ? //繪制方法1:---原圖,制作偏移

? ? ? ? canvas.drawBitmap(bitmap,100,100,mPaint);//將圖片從(0,0)位置向左偏移100,向右偏移100

?

? ? ? ? Rect srcRect = new Rect(0,0,bitmap.getWidth()/2,bitmap.getHeight()/2);//截取圖片左上1/4的區域

?

? ? ? ? Rect dstRect = new Rect(500,500,800,800);//圖片需要繪制的矩形區域

? ? ? ? //繪制方法2:--先裁剪再展示

? ? ? ? canvas.drawBitmap(bitmap,srcRect,dstRect, mPaint);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15557.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15557.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15557.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

速盾:流量攻擊防護DDOS有哪幾種有效的防御措施?

DDoS(分布式拒絕服務)攻擊是一種網絡攻擊方式,攻擊者通過向目標服務器發送大量的請求,超出其處理能力,導致服務器無法正常運行,從而使服務中斷或降級。為了保護網絡安全,減少DDoS攻擊對網站和服…

Kafka(十三)監控與告警

目錄 Kafka監控與告警1 解決方案1.2 基礎知識JMX監控指標代理查看KafkaJMX遠程端口 1.3 真實案例Kafka Exporter:PromethusPromethus Alert ManagerGrafana 1.3 實際操作部署監控和告警系統1.2.1 部署Kafka Exporter1.2.2 部署Prometheus1.2.3 部署AlertManger1.2.4 添加告警規…

大疆上云API本地部署與飛機上云

文章目錄 前言一、安裝基礎環境1. EMQX 安裝(版本4.4.0)2. MySql 安裝(版本8.0.26)3. Redis 安裝 二、部署后端(JDK必須11及以上)三、部署前端四、成為大疆開發者五、飛機注冊上云六、綁定飛機七、無人機狀態查看八、直播流查看 前言 大疆上云API官方文…

HarmonyOS鴻蒙應用開發——ArkTS的“內置組件 + 樣式 + 循環和條件渲染”

一、內置組件是咩? 學過前端的都知道,一個組件就是由多個組件組成的,一個組件也可以是多個小組件組成的,組件就是一些什么導航欄、底部、按鈕......啥的,但是組件分為【自定義組件】跟【內置組件】 【自定義組件】就…

Web開發核心

文章目錄 1.http協議簡介2.http協議特性3.http請求和響應協議4.最簡單的Web程序5.基于flask搭建web?站6.瀏覽器開發者?具(重點) 1.http協議簡介 HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用于 萬維網(WWW:Norld W…

【狂神說Java】Redis筆記以及拓展

一、Redis 入門 Redis為什么單線程還這么快? 誤區1:高性能的服務器一定是多線程的? 誤區2:多線程(CPU上下文會切換!)一定比單線程效率高! 核心:Redis是將所有的數據放在內…

用于時間序列概率預測的蒙特卡洛模擬

大家好,蒙特卡洛模擬是一種廣泛應用于各個領域的計算技術,它通過從概率分布中隨機抽取大量樣本,并對結果進行統計分析,從而模擬復雜系統的行為。這種技術具有很強的適用性,在金融建模、工程設計、物理模擬、運籌優化以…

【C語言】C語言-設備管理系統(源碼+數據文件)【獨一無二】

👉博__主👈:米碼收割機 👉技__能👈:C/Python語言 👉公眾號👈:測試開發自動化【獲取源碼商業合作】 👉榮__譽👈:阿里云博客專家博主、5…

AI大模型:大數據+大算力+強算法

前言:好久不見,甚是想念,我是辣條,我又回來啦,兄弟們,一別兩年,還有多少老哥們在呢? 目錄 一年半沒更文我干啥去了? AI大模型火了 人工智能 大模型的理解 為什么學習…

ComfyUI完全入門:圖生圖局部重繪

大家好,我是每天分享AI應用的螢火君! 這篇文章的主題和美女有關,不過并不是教大家生產美女視頻,而是講解 ComfyUI 的圖生圖局部重繪,其中將會以美女圖片為例,來展示局部重繪的強大威力。 先看看效果&…

2024年5月26日 十二生肖 今日運勢

小運播報:2024年5月26日,星期日,農歷四月十九 (甲辰年己巳月庚寅日),法定節假日。 紅榜生肖:馬、豬、狗 需要注意:牛、蛇、猴 喜神方位:西北方 財神方位:…

java hashmap在項目中的使用

java hashmap在項目中的使用 1,緩存機制: 在需要頻繁訪問數據但又不想每次都從數據庫或遠程服務獲取的場景中,可以使用 HashMap 作為緩存。例如,在一個 Web 應用程序中,用戶信息可能只需要在登錄時從數據庫檢索一次&a…

解釋器和編譯器(程序語言基礎)

一、解釋器 解釋器則是一種逐行或逐段地解釋執行源代碼的工具。解釋器會直接讀取源代碼,并在運行時逐行或逐段地解釋執行代碼,不生成獨立的目標代碼文件。解釋器適用于一些動態語言,允許用戶在代碼執行過程中進行交互,更容易調試…

【linux_常用的指令】

筆記 1連接遠程主機2 兩臺主機間復制2.1 查看當前目錄2.2 普通復制 3 創建能運行sudo命令的用戶3.1 更改用戶admin的密碼3.2 切換到admin用戶,并且啟動一個新的shell3.3 更改文件或目錄的權限 4 切換目錄5 解.tar.gz格式的壓縮包6 運行.sh文件7 查看當前目錄的所有文…

泛型中K T V E ? Object等分別代表的含義

E – Element (在集合中使用,因為集合中存放的是元素) T – Type(Java 類) K – Key(鍵) V – Value(值) N – Number(數值類型) ? – 表示不確定的java類型&…

一個月速刷leetcodeHOT100 day07 輪轉數組 除自身以外的乘積 找到字符串中所有字母異位詞

輪轉數組 給定一個整數數組 nums,將數組中的元素向右輪轉 k 個位置,其中 k 是非負數。 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右輪轉 1 步: [7,1,2,3,4,5,6] 向右輪轉 2 步: [6,7,1,2,3,4,5] 向右輪轉 3 步: […

系統思考—跳出癥狀看全局

結束了《系統思考—跳出癥狀看全局》的迭代課程后,我感觸頗深。通過一個深入的案例研討、互動討論和實戰演練,學員們不僅更好地理解了如何跳出癥狀看全局,還掌握了制定更具前瞻性和可持續性策略的方法。我們還探討了如何在實際工作中應用這些…

《python編程從入門到實踐》day38

# 昨日知識點回顧 定義、遷移模型Entry # 今日知識點學習 18.2.7 Django shell 每次修改模型后,看到重啟后的效果需要重啟shell,退出shell會話Windows系統按ctrlZ或者輸入exit() 18.3 創建頁面:學習筆記主頁 創建頁面三階段&#xf…

介紹一下Hugging Face,這個公司的背景是什么

Hugging Face是一家成立于2016年的人工智能公司,專注于為AI研究人員和開發者提供開源模型庫和工具。以下是關于Hugging Face公司的詳細背景介紹: 公司歷史與創始人: Hugging Face由Clment Delangue、Julien Chaumond和Thomas Wolf三位法國籍…

E0144 “const char *“ 類型的值不能用于初始化 “char *“ 類型的實體

解決方案: 在Visual Studio中,在項目上右鍵,屬性 >> C/C >> 語言 >> 符合模式,改為“否”。