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 {

	@Override
	protected 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;//空1dp
		float 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;
	}
}
时间: 2024-08-23 00:11:19

android开发步步为营之58:给图片绘制圆形气泡背景效果的相关文章

Android开发之自定义圆角矩形图片ImageView的实现

android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆角矩形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap,然后进行裁剪对应的圆角矩形的bitmap,然后在onDraw()进行绘制圆角矩形图片输出. 效果图如下: 自定义的圆形的ImageView类的实现代码如下: package com.xc.xcskin.view; import android.content.Context; import and

Android开发ImageView控件缩放图片

首先还是最基础的ImageView控件如何显示图片: <ImageView                Android:id="@+id/imgView"                android:layout_width="fill_parent"                android:layout_height="fill_parent"                android:src="@drawable

android开发——camera类拍照指定图片大小

android拍照开发 android开发实现拍照功能主要有两种方法: 直接调用系统照相机API实现拍照,拍完后,图片会保存在相册中,返回保存照片的路径,从而获取图片. 自己写SurfaceView调用camera来实现拍照,该方法触发一个回调,参数中包含一个图片字节数组,从而获取图片. 问题 当我们自定义相机时,需求需要指定拍照图片大小,然而不同手机会默认返回不同分辨率照片.所以需要对camera进行参数设置.通过设置setPictureSize,代码: // 获得相机参数 Camera.Pa

android开发步步为营之66:android图片选取

最近做一个页面,反馈问题页面,有个用户上传问题图片的功能.本来很笨的想把系统的所有图片列出来,然后让用户选择,后来发现原来可以直接打开手机所有图片的api的.效果如图: 给出主要代码: 1.选择图片 Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, 1); 2.获取图片 protect

android开发步步为营之50:android关于加载大图片java.lang.OutOfMemoryError错误的解决

 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html 官方有一篇文章是如下这么解决的,通过Resource加载后压缩图片大小 //方法一:通过Resource加载 mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100)); public static Bitm

Android开发技巧——定制仿微信图片裁剪控件

拍照--裁剪,或者是选择图片--裁剪,是我们设置头像或上传图片时经常需要的一组操作.上篇讲了Camera的使用,这篇讲一下我对图片裁剪的实现. 背景 下面的需求都来自产品. 裁剪图片要像微信那样,拖动和放大的是图片,裁剪框不动. 裁剪框外的内容要有半透明黑色遮罩. 裁剪框下面要显示一行提示文字(这点我至今还是持保留意见的). 在Android中,裁剪图片的控件库还是挺多的,特别是github上比较流行的几个,都已经进化到比较稳定的阶段,但比较遗憾的是它们的裁剪过程是拖动或缩放裁剪框,于是只好自己

android开发步步为营之35:GridView的用法

之前使用asp.net开发软件的过程中也使用GridView,发现android里面也有这么一个控件,使用方法有点相似,都是使用适配器将数据绑定到这个控件,然后将数据展示出来,应该说它和ListView一样,是个非常常用的控件,所以我们应该学习如何使用它,理论知识是没多少的,就是一个展示数据的控件,继承关系如下: public class GridView extends AbsListView java.lang.Object android.view.View android.view.Vi

android开发步步为营之56:Android开发技术点总结(持续更新)

1.eclipse svn插件下载 http://subclipse.tigris.org/update_1.6.x http://subclipse.tigris.org/update_1.8.x 64位机器 http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA 2.eclipse常用插件下载 http://blog.csdn.net/jackiehff/article/details/8181945 3.unico

android开发步步为营之70:android接入Google Analytics总结

求人不如求己,今天项目里要接入Google Analytics,这个是做应用统计分析用的,可以查看当前手机活跃用户,事件点击等等数据,先看看效果: 之前eclipse里面接入已经成功,昨天项目组决定项目转成使用android studio来开发,看google官方文档,官方文档https://developers.google.com/analytics/devguides/collection/android/v4/,然后官方文档里面的配置文件是用google-services.json的,这