Android中特殊图形的生成例子

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.Align;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;

public class DrawUtil
{
	/**
	 * 画出一个这样一个图形:中间带标题文字的半圆,半圆可以设置阴影和顶部的矩形投影
	 *
	 * @param text
	 *            标题文字 (此处设置为两个字的居中效果)
	 * @param radio
	 *            半圆的半径
	 * @param shadowWidth
	 *            阴影的宽度
	 * @param isWithRectf
	 *            是否有矩形投影
	 * @param rectfColor
	 * 			      矩形投影的颜色
	 * @param paint
	 *            画笔对象
	 * @return
	 */
	public static Bitmap drawHalfCircleWithText(String text, int radio,
			int shadowWidth, boolean isWithRectf, int rectfColor, Paint paint)
	{
		Bitmap bitmap = Bitmap.createBitmap(radio * 2,
			 radio * 2 + shadowWidth, Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		// 画一个带圆心的扇形,此处为半圆
		canvas.drawArc(new RectF(0, 0, radio * 2, radio * 2), 360, 180, true,
				paint);

		// 是否需要在半圆顶部画出一个矩形投影

		if (isWithRectf)
		{
			paint = reset(paint);
			paint.setColor(rectfColor);
			Bitmap bmp = drawRectf(radio * 2, radio/8, paint);

			paint = reset(paint);
			paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));//去掉矩形投影和半圆不相交的部分
			canvas.drawBitmap(bmp, 0, radio, paint);

		}else
		{
			LinearGradient lg=new LinearGradient(0,0,0,radio/8,0x44000000,0x00000000,Shader.TileMode.MIRROR);
			paint = reset(paint);
			paint.setShader(lg);
			Bitmap bmp = drawRectf(radio * 2, radio/8, paint);

			paint = reset(paint);
			paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));//去掉矩形投影和半圆不相交的部分
			canvas.drawBitmap(bmp, 0, radio, paint);
		}

		//在半圆上面画上文字
		paint = reset(paint);
		paint.setColor(Color.WHITE);
		paint.setTextSize(radio * 5 / 12);
		paint.setTextAlign(Align.CENTER);
		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
		canvas.drawText(text, radio, radio * 5 / 3, paint);
		bitmap = Bitmap.createBitmap(bitmap, 0, radio, radio * 2, radio
				+ shadowWidth);
		return bitmap;
	}

	/**
	 * 根据宽度画出一条指定三角形数量的锯齿
	 *
	 * @param screenWidth
	 *            宽度
	 * @param triangleHeight
	 *            锯齿的高度
	 * @param triangleNum
	 *            三角形的数量
	 * @param isDown
	 * 			  三角形顶点的朝向,true表示向下,false表示向上
	 * @param paint
	 *            画笔对象
	 * @return 返回bitmap对象
	 */
	public static Bitmap drawtriangle(float screenWidth, float triangleHeight,
			int triangleNum, boolean isDown,Paint paint)
	{
		float triangleWidth = screenWidth / triangleNum;
		Bitmap bitmap = Bitmap.createBitmap((int) screenWidth,
				(int) triangleHeight, Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		Path path = new Path();
		if(isDown)
		{
			path.moveTo(0, 0);
			for (int i = 0; i < triangleNum * 2; i++)
			{
				if (i % 2 == 0)
				{
					path.lineTo((triangleWidth / 2) * (i + 1), triangleHeight);
				} else if (i % 2 == 1)
				{
					path.lineTo((triangleWidth / 2) * (i + 1), 0);
				}
			}
		}else
		{
			path.moveTo(0, triangleHeight);
			for(int i = 0; i < triangleNum * 2; i++)
			{
				if(i % 2 == 0)
				{
					path.lineTo((triangleWidth / 2) * (i + 1), 0);
				} else if(i % 2 == 1)
				{
					path.lineTo((triangleWidth / 2) * (i + 1), triangleHeight);
				}
			}
		}
		path.close();
		canvas.drawPath(path, paint);
		return bitmap;
	}

	/**
	 * 画出一条带有指定半圆数量的花边
	 * @param width 花边的长度
	 * @param num 半圆的数量
	 * @param paint 画笔对象
	 * @return
	 */
	public static Bitmap drawMultHalfCircle(int width, int num,Paint paint)
	{
		int radio = (width/num)/2;
		Bitmap bitmap = Bitmap.createBitmap(width,
			 radio, Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		for(int i = 0; i < num; i++)
		{
			canvas.drawBitmap(drawHalfCircle(radio, paint), radio*2*i, 0, paint);
		}
		return bitmap;
	}

	/**
	 * 画一个矩形
	 * @param width
	 * @param height
	 * @param color
	 * @param paint
	 * @return
	 */
	public static Bitmap drawRectf(float width, float height, Paint paint)
	{
		Bitmap bitmap = Bitmap.createBitmap((int)width, (int)height, Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		canvas.drawRect(0, 0, width, height, paint);
		return bitmap;
	}

	/**
	 * 画出一个半圆
	 *
	 * @param radio
	 *            半径
	 * @param paint
	 * @return
	 */
	public static Bitmap drawHalfCircle(int radio, Paint paint)
	{
		Bitmap bitmap = Bitmap.createBitmap((int) (radio * 2),
				(int) (radio * 2), Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		canvas.drawArc(new RectF(0, 0, radio * 2, radio * 2), 360, 180, true,
				paint);
		bitmap = Bitmap.createBitmap(bitmap, 0, radio, radio * 2, radio);
		return bitmap;
	}

	/**
	 * 根据图片的短边裁剪成圆形并在周围画上一定宽度的白边
	 * @param bitmap
	 * @param ringWidth
	 * @param radio
	 * @param paint
	 * @return
	 */
	public static Bitmap drawBitmapWithRing(Bitmap bitmap,int ringWidth,Paint paint)
	{
		Bitmap roundBitmap = toRoundBitmap(bitmap);
		int radio = roundBitmap.getWidth() / 2;
		Bitmap _bitmap = Bitmap.createBitmap((radio+ringWidth) * 2,
				(radio+ringWidth) * 2, Config.ARGB_8888);
		Canvas canvas = new Canvas(_bitmap);
		canvas.drawCircle((radio+ringWidth), (radio+ringWidth), (radio+ringWidth), paint);

		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
		canvas.drawBitmap(roundBitmap, ringWidth, ringWidth, paint);
		return _bitmap;
	}

	   /**
     * 将图像裁剪成圆形
     *
     * @param bitmap
     * @return
     */
    public static Bitmap toRoundBitmap(Bitmap bitmap)
    {
    	if(bitmap == null)
    	{
    		return null;
    	}

        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float roundPx;
        float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
        if (width <= height)
        {
            roundPx = width / 2;
            top = 0;
            bottom = width;
            left = 0;
            right = width;
            height = width;
            dst_left = 0;
            dst_top = 0;
            dst_right = width;
            dst_bottom = width;
        } else
        {
            roundPx = height / 2;
            float clip = (width - height) / 2;
            left = clip;
            right = width - clip;
            top = 0;
            bottom = height;
            width = height;
            dst_left = 0;
            dst_top = 0;
            dst_right = height;
            dst_bottom = height;
        }

        Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect src = new Rect((int) left, (int) top, (int) right,
                (int) bottom);
        final Rect dst = new Rect((int) dst_left, (int) dst_top,
                (int) dst_right, (int) dst_bottom);
        final RectF rectF = new RectF(dst);

        paint.setAntiAlias(true);

        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, src, dst, paint);
        return output;
    }

    public static Bitmap darwShadow(Bitmap bitmap,int color,int padding)
    {
        int width = bitmap.getWidth() + padding;
        int height = bitmap.getHeight() + padding;
        Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        Paint paint = new Paint();
        paint = reset(paint);
        paint.setColor(color);
        canvas.drawBitmap(bitmap, padding/2, padding/2, null);
        canvas.drawRoundRect(new RectF(0, 0, width, height),padding/2,padding/2,paint);
        return output;
    }

	private static Paint reset(Paint paint)
	{
		paint.reset();
		paint.setAntiAlias(true);
		paint.setStyle(Paint.Style.FILL);
		return paint;
	}
}

时间: 2024-08-10 08:55:19

Android中特殊图形的生成例子的相关文章

Android中Service的一个Demo例子

Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Service做过多讲解.  代码是从网上找的一个例子,Copy下来发现代码不完全正确,稍微修改了下.  AndroidManifest.xml <application android:icon="@drawable/ic_launcher" android:label="@stri

Android中如何提取和生成mp4文件

随着Android 4.4及以上版本的逐渐普及,Android 4.1引入的MediaExtractor类,以及Android 4.3引入的MediaMuxer类,终于可以开始正式地"发光发热"了. MediaMuxer类主要用于将音频和视频数据进行混合生成多媒体文件(如:mp4文件),而MediaExtractor则刚好相反,主要用于多媒体文件的音视频数据的分离. 本文将介绍如何利用Android SDK提供的MediaExtractor和MediaMuxer类来完成mp4文件的提取

Android中关于JNI 的学习(零)简单的例子,简单地入门

Android中JNI的作用,就是让Java能够去调用由C/C++实现的代码,为了实现这个功能,需要用到Anrdoid提供的NDK工具包,在这里不讲如何配置了,好麻烦,配置了好久... 本质上,Java去调用C/C++的代码其实就是去调用C/C++提供的方法,所以,第一步,我们要创建一个类,并且定义一个Native方法,如下: JniTest类: public class JniTest { public native String getTestString(); } 可以看到,在这个方法的前

Android中关于JNI 的学习(四)简单的例子,温故而知新

在第零篇文章简单地介绍了JNI编程的模式之后,后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我到底说的清楚没有,但相信很多童鞋跟我一样,在刚开始学习一个东西的时候,入门最好的方式就是一个现成的例子来参考,慢慢研究,再学习概念,再回过来研究代码,加深印象,从而开始慢慢掌握. 今天我们就再来做一个小Demo,这个例子会比前面稍微复杂一点,但是如果阅读过前面几篇文章的话,理解起来也还是很简单的.很多东西就是这样,未知的时候很可怕,理解了就很简单了. 1)我们首先定义一个Jav

Android中GPU硬件加速控制及其在2D图形绘制上的局限

图形的渲染可分为两种:软件渲染和硬件渲染.软件渲染是靠CPU计算各种坐标并绘制,主要是占用内存:硬件渲染是靠GPU,主要占用显存,一般的3D图形程序(OpenGL.DirectX)都是GPU加速的. 在Android3.0之前,2D绘图API只支持软件渲染模式,从Android3.0开始,2D绘图API开始支持GPU硬件渲染,即View中的Canvas的绘图操作会使用GPU,所以从Android 3.0(API Level 11)开始,View中就多了一些和硬件相关的方法.如果App的Andro

android中生成excel

都说程序员不爽产品经理,其实有的时候遇到一些奇葩的后台开发人员也会很不顺心.最近项目有这样一个要求,要生成一个excel然后发邮件给客户.结果后台人员直接把这个功能扔给客户端,理由是后台不好实现.听到这也就只能自己实现了(分分钟就想来个螺旋王扣它头上).这篇博客讲下如下在android中生成excel表并存到本地.先看下生成后的效果图: 初始化数据 首先我们要先造下测试数据,这里我把数据写死在一个常量类Const中,如下: public class Const { public interfac

android中drawable资源的解释及例子

文章中的内容参考Dev Guide中的Drawable Resources,英文好的朋友可以直接去读英文.总结这篇文章的目的是自己在使用drawable资源遇到一些问题跟大家分享下,同时整理下自己对drawable的理解. drawable资源共有10种,包括Bitmap文件.Nine-Path文件.Layer List.State List.Level list.Transition Drawable.Inset Drawable.Clip Drawable.Scale Drawable.Sh

浅谈android中图片处理之图形变换特效Matrix(四)

今天,我们就来谈下android中图片的变形的特效,在上讲博客中我们谈到android中图片中的色彩特效来实现的.改变它的颜色主要通过ColorMatrix类来实现. 现在今天所讲的图片变形的特效主要就是通过Matrix类来实现,我们通过上篇博客知道,改变色彩特效,主要是通过ColorMatrxi矩阵的系数,以及每个像素点上所对应的颜色偏移量.而今天的图形变换与那个也是非常的类似.它是一个3*3矩阵,而颜色矩阵则是一个4*5的矩阵.在这个3*3矩阵中则表述出了每个像素点的XY坐标信息.然后通过修

【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布局的根节点开始,从根节点开始测量和绘制整个layout tree. 每一个ViewGroup 负责要求它的每一个孩子被绘制,每一个View负责绘制自己. 因为整个树是按顺序遍历的,所以父节点会先被绘制,而兄弟节点会按照它们在树中出现的顺序被绘制. 绘制是一个两遍(two pass)的过程:一个mea