android開發步步為營之58:給圖片繪製圓形氣泡背景效果,

來源:互聯網
上載者:User

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;}}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.