1. 程式人生 > >Android 繪製圓角圖片(圓形圖片,圓角矩形圖片,圓角正方形圖片)【轉】

Android 繪製圓角圖片(圓形圖片,圓角矩形圖片,圓角正方形圖片)【轉】

我們在Android應用中經常要繪製圓角的圖片來展示一些背景圖,但是每次都製作圓角的圖片很麻煩,而且重複使用率不高。所以我們最好的就是在應用中根據已有的圖片,動態的繪製所需要的圓角圖片用於顯示。話不多說,讓我們先看看效果圖:


這是例子中使用到的圖片:


怎麼樣,效果很好吧。

實現繪製圓角圖片的原理很簡單,就是在程式中動態生成一張Bitmap,然後再用Paint在這張Bitmap中繪製所需的圖形(如圓形),再根據paint的setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN))屬性設定在Bitmap中畫的圓形和所要顯示的圖片的交集,並取圖片部分,那樣就生成了圓形的圖片。“

其中Mode取值有如下一些值:

  1. 1.PorterDuff.Mode.CLEAR  
  2. 所繪製不會提交到畫布上。  
  3. 2.PorterDuff.Mode.SRC  
  4. 顯示上層繪製圖片  
  5. 3.PorterDuff.Mode.DST  
  6. 顯示下層繪製圖片  
  7. 4.PorterDuff.Mode.SRC_OVER  
  8. 正常繪製顯示,上下層繪製疊蓋。  
  9. 5.PorterDuff.Mode.DST_OVER  
  10. 上下層都顯示。下層居上顯示。  
  11. 6.PorterDuff.Mode.SRC_IN  
  12. 取兩層繪製交集。顯示上層。  
  13. 7.PorterDuff.Mode.DST_IN  
  14. 取兩層繪製交集。顯示下層。  
  15. 8.PorterDuff.Mode.SRC_OUT  
  16. 取上層繪製非交集部分。  
  17. 9.PorterDuff.Mode.DST_OUT  
  18. 取下層繪製非交集部分。  
  19. 10.PorterDuff.Mode.SRC_ATOP  
  20. 取下層非交集部分與上層交集部分  
  21. 11.PorterDuff.Mode.DST_ATOP  
  22. 取上層非交集部分與下層交集部分  
  23. 12.PorterDuff.Mode.XOR  
  24. 取兩層繪製非交集。兩層繪製非交集。  
  25. 13.PorterDuff.Mode.DARKEN  
  26. 上下層都顯示。變暗  
  27. 14.PorterDuff.Mode.LIGHTEN  
  28. 上下層都顯示。變數  
  29. 15.PorterDuff.Mode.MULTIPLY  
  30. 取兩層繪製交集  
  31. 16.PorterDuff.Mode.SCREEN  
  32. 上下層都顯示。  

原理就是這樣,接下來我們看看示例程式碼怎麼應用:

第一:先看佈局檔案activity_main.xml

  1. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent">
  5.     <ImageView
  6.         android:id="@+id/source"
  7.         android:layout_width="100dip"
  8.         android:layout_height="100dip"
  9.         android:layout_centerHorizontal="true"
  10.         android:layout_marginBottom="20dip"
  11.         android:layout_marginTop="20dip"
  12.         android:src="@drawable/demo"/>
  13.     <ImageView
  14.         android:id="@+id/circle"
  15.         android:layout_width="100dip"
  16.         android:layout_height="100dip"
  17.         android:layout_centerHorizontal="true"
  18.         android:layout_below="@id/source"
  19.         android:layout_marginBottom="20dip"/>
  20.     <ImageView
  21.         android:id="@+id/rect"
  22.         android:layout_width="100dip"
  23.         android:layout_height="100dip"
  24.         android:layout_below="@id/circle"
  25.         android:layout_centerHorizontal="true"
  26.         android:layout_marginBottom="20dip"/>
  27.     <ImageView
  28.         android:id="@+id/squre"
  29.         android:layout_width="100dip"
  30.         android:layout_height="100dip"
  31.         android:layout_below="@id/rect"
  32.         android:layout_centerHorizontal="true"/>
  33. </RelativeLayout>

這裡定義了四個Imageview,第一個為原圖,第二個為圓形圖片,第三個為圓角矩形,第四個為圓角正方形。

第二:為了節省空間,我就把生成圖片的程式碼寫在了MainActivity中,如下,註釋都很清楚:

  1. package com.demo.imagetype;  
  2. import android.app.Activity;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.Bitmap.Config;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Paint;  
  7. import android.graphics.PorterDuffXfermode;  
  8. import android.graphics.RectF;  
  9. import android.graphics.drawable.BitmapDrawable;  
  10. import android.graphics.drawable.Drawable;  
  11. import android.os.Bundle;  
  12. import android.widget.ImageView;  
  13. publicclass MainActivity extends Activity {  
  14.     private ImageView circle;  
  15.     private ImageView rect;  
  16.     private ImageView squre;  
  17.     @Override
  18.     protectedvoid onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_main);  
  21.         circle = (ImageView)findViewById(R.id.circle);  
  22.         rect = (ImageView)findViewById(R.id.rect);  
  23.         squre = (ImageView)findViewById(R.id.squre);  
  24.         /** 獲取圖片資源並轉換為 Bitmap型別 */
  25.         Drawable drawable = getResources().getDrawable(R.drawable.demo);   
  26.         BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;    
  27.         Bitmap bitmap = bitmapDrawable.getBitmap();  
  28.         circle.setImageBitmap(getCircleBitmap(bitmap));  
  29.         rect.setImageBitmap(drawRect(bitmap, 80));  
  30.         squre.setImageBitmap(drawSqureRect(bitmap, 80));  
  31.     }  
  32.     /** 
  33.      * 繪製圓形 
  34.      * @param source 
  35.      * @return 
  36.      */
  37.     publicstatic Bitmap getCircleBitmap(Bitmap source)  
  38.     {  
  39.         // 以最小的邊為圓的半徑
  40.         int min = 0;  
  41.         if(source.getWidth() < source.getHeight())  
  42.         {  
  43. 相關推薦

    realloc 使用詳解分析realloc invalid pointer、指針無效等錯誤

    strong 開源 堆區 找到 失敗 temp idt googl 發生 來源:http://www.cnblogs.com/ladd/archive/2012/06/30/2571420.htmlrealloc函數用來為ptr重新分配大小為size的一塊內存,看似很簡單,

    Android 繪製圓角圖片圓形圖片圓角矩形圖片圓角正方形圖片

    我們在Android應用中經常要繪製圓角的圖片來展示一些背景圖,但是每次都製作圓角的圖片很麻煩,而且重複使用率不高。所以我們最好的就是在應用中根據已有的圖片,動態的繪製所需要的圓角圖片用於顯示。話不多說,讓我們先看看效果圖: 這是例子中使用到的圖

    Android--利用相機或相簿擷取使用者頭像解決了miui無法擷取以及部分機型拍照無返回Uri

    宣告:本文的Demo可用於從本地獲取使用者頭像時使用,解決了有些手機系統相機拍照後獲取不到拍攝照片的問題,以及解決小米miui系統呼叫系統裁剪圖片功能camera.action.CROP後崩潰或重新開啟app的問題。 主活動檔案ChooseImageMain

    Android--利用相機或相簿擷取使用者頭像解決了miui無法擷取以及部分機型拍照無返回Uri

    宣告 本文的Demo可用於從本地獲取使用者頭像時使用,解決了有些手機系統相機拍照後獲取不到拍攝照片的問題,以及解決小米miui系統呼叫系統裁剪圖片功能camera.action.CROP後崩潰或重新開啟app的問題。 修改了部分機型拍照後返回的是縮圖的臨時

    Source Insight 中文註釋為亂碼解決辦法完美解決一鍵搞定

    ash save sys lan sim edit ext pan character 轉自:http://blog.csdn.net/bjarnecpp/article/details/70174752 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 S

    oracle使用TRUACTE刪除數據時提示資源正忙

    ESS 正常 HERE sign order by where terminal spi ora 查詢記錄的鎖定對象,select * from v$locked_object(身份必須是DBA權限),然後找到對應的sid和serial#殺掉了會話;

    Android 屬性動畫Property Animation 完全解析

    轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/38067475 1、概述 Android提供了幾種動畫型別:View Animation 、Drawable Animation 、Property Anima

    linux驅動由淺入深系列:PBL-SBL1-(bootloader)LK-Android啟動過程詳解之一高通MSM8953啟動例項

    本文轉載自:https://blog.csdn.net/radianceblau/article/details/73229005 對於嵌入式工程師瞭解晶片啟動過程是十分有必要的,在分析、除錯各種問題的時候都有可能涉及到這方面的知識。同時這部分知識也是比較複雜的,因為其中涉及到晶片內部架構,啟動各個階段軟體

    UbuntuWindows 遠端桌面連線ubuntu及xrdp的一些小問題遠端桌面閃退、連線失敗、tab補全功能無選單欄error - problem connecting

    轉:https://blog.csdn.net/u014447845/article/details/80291678 1、遠端桌面閃退,shell可以用的問題:(1)需要在該使用者目錄建立一個.xsession:touch .xsession(2)裡面寫“xfce4-session”一句話就行:echo

    Android在標準linux基礎上對休眠喚醒的實現

    說明: 1. Based on linux 2.6.32 and android 2.2,only support SDR(mem). 2. 參考文章: 一、新增特性介紹 實際上,android仍然是利用了標準linux的休眠喚醒系統,只不過添加了一些使用

    python編程python開發的三種運行模式

    阻塞 data tail 驗證 目錄 pro 什麽 read bus 轉自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)[-]

    Spark SQL編程指南Python

    res 平臺 per 它的 split 執行 文件的 分組 不同 轉自:http://www.cnblogs.com/yurunmiao/p/4685310.html 前言 Spark SQL允許我們在Spark環境中使用SQL或者Hive SQL執行關系型查詢。它的核

    100行代碼實現最簡單的基於FFMPEG+SDL的視頻播放器SDL1.x

    工程 全屏 升級版 gin avcodec ive 系列文章 相同 hello 轉自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版權聲明:本文為博主原創文章,未經博主允許不得轉載。

    常用牛人主頁鏈接計算機視覺、模式識別、機器學習相關方向,陸續更新。。。。

    short psu works charles 貝葉斯 learning 數學 ocr 相關 轉自:http://blog.csdn.net/goodshot/article/details/53214935 目錄(?)[-] The Kalman

    git代碼倉庫遷移從github到oschina

    mit tail name usr done git blank com detail 轉自:http://blog.csdn.net/a5244491/article/details/44807937 版權聲明:本文為博主原創文章,未經博主允許不得轉載。

    Linux內核中斷引入用戶空間異步通知機制

    sso mis 文件 ack 文件的 ssi dsm 進行 log 轉自:http://blog.csdn.net/kingdragonfly120/article/details/10858647 版權聲明:本文為博主原創文章,未經博主允許不得轉載。

    linux 系統函數之 dirname, basename

    bsp spa csdn 跨平臺 dirname 轉載 nbsp 描述 dir 轉自:http://blog.csdn.net/peter_cloud/article/details/9308333 版權聲明:本文為博主原創文章,未經博主允許不得轉載。

    C++ operator重載操作符

    整體 比較大小 對象的比較 剛才 ret 使用方法 運算符 等等 內置 轉自:http://www.cnblogs.com/xiangxiaodong/archive/2012/02/12/2348144.html operator是C++的關鍵字,它和運算符

    ArcGIS Server10.1之服務新特性WMTS1.0.0

    class href 知識 技術分享 restful cgi art 存在 alt http://blog.csdn.net/esrichinacd/article/details/7825587 ArcGIS Server10.1正式支持OGC的WMTS1.0.0版

    前端小小白的學習之路整理幾道面試題之HTTP協議

    ase 賬號 檢測 提交數據 大型數據集 tor 添加 描述 分享 轉自:http://www.cnblogs.com/ranyonsue/p/5984001.html HTTP簡介 HTTP協議是Hyper Text Transfer Protocol(超文本傳輸