android開發步步為營之58:給圖片繪製圓形氣泡背景效果,
最近在開發項目的時候,有一個需求,需要給應用表徵圖繪製圓形氣泡背景,有了彩色氣泡這樣顯得漂亮一點,氣泡的顏色是應用表徵圖的顏色均值,先看看效果,然後,我再給出demo。
demo應用表徵圖是這樣的:
添加氣泡背景後是這樣的:
仔細看圓形背景顏色是表徵圖顏色的均值。
好的,下面我們來完成這個demo。
第一步、編寫頁面activity_drawcycle.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/imgCycle" android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/ic_launcher" /></LinearLayout>
第二步、編寫Activity,DrawCycleActivity.java
/** * */package com.figo.study;import com.figo.study.utils.UIUtils;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuffXfermode;import android.graphics.Bitmap.Config;import android.graphics.RectF;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.widget.ImageView;/** * @author figo * */public class DrawCycleActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_drawcycle); //需要給該圖片繪製圓形氣泡背景Drawable img = getResources().getDrawable(R.drawable.ic_launcher);//繪製圓形氣泡Bitmap bp = createCircleImage(drawableToBitmap(img),40); //繪製好的圖片賦值給ImageView控制項ImageView imgView = (ImageView) findViewById(R.id.imgCycle);imgView.setImageDrawable(new BitmapDrawable(bp));}private Bitmap drawableToBitmap(Drawable drawable){Bitmap bitmap=null;try {bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight(),drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565);Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());drawable.draw(canvas);} catch (Exception e) {// TODO: handle exception}return bitmap;}private Bitmap createCircleImage(Bitmap source, int sizeDp) {final Paint paint = new Paint();final int nw = source.getWidth(); final int nh = source.getHeight(); //計算源圖片顏色平均值,然後將該平均值顏色作為氣泡顏色 int[] pixels = new int[nw * nh]; source.getPixels(pixels, 0, nw, 0, 0, nw, nh); long rtotal=0; long gtotal=0; long btotal=0; for (int i = 0; i < pixels.length; i++) { int p = pixels[i]; int r = (p & 0x00FF0000) >> 16; int g = (p & 0x0000FF00) >> 8; int b = (p & 0x000000FF) >> 0; rtotal+=r; gtotal+=g; btotal+=b; } int rAverage=(int) (rtotal / (nw * nh)); int gAverage=(int) (gtotal / (nw * nh)); int bAverage=(int) (btotal / (nw * nh)); //設定畫筆顏色paint.setColor(Color.argb(255, rAverage, gAverage, bAverage));paint.setAntiAlias(true);int sizePix=UIUtils.dip2px(DrawCycleActivity.this,sizeDp);Bitmap target = Bitmap.createBitmap(sizePix, sizePix, Config.ARGB_8888);//繪製正方形畫布Canvas canvas = new Canvas(target); //在正方形裡面繪製圓形canvas.drawCircle(sizePix/2, sizePix/2, sizePix / 2, paint);//圖片相交模式,canvas原有的圖片 可以理解為背景 就是dst,新畫上去的圖片 可以理解為前景 就是src//SRC_OVER就是新畫上去的圖片在canvas之上paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_OVER)); //計算靶心圖表形的左上方和右下角的座標RectF dst=new RectF(); //圓形內建正方形(即將繪製的圖片地區)的邊長float destRectWidth= (float)Math.sqrt((sizeDp*sizeDp/2));float left= (sizeDp-destRectWidth)/2+1;//空1dpfloat top=left;float right=sizeDp-left;float bottom=right;//dst.set(UIUtils.dip2px(DrawCycleActivity.this, 5.86f), UIUtils.dip2px(DrawCycleActivity.this,5.86f), UIUtils.dip2px(DrawCycleActivity.this,34.14f), UIUtils.dip2px(DrawCycleActivity.this,34.14f));dst.set(UIUtils.dip2px(DrawCycleActivity.this,left), UIUtils.dip2px(DrawCycleActivity.this,top), UIUtils.dip2px(DrawCycleActivity.this,right),UIUtils.dip2px(DrawCycleActivity.this,bottom));canvas.drawBitmap(source, null, dst, paint);return target;}}