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;
}
}
Android中特殊图形的生成样例的更多相关文章
- Android清理设备内存具体完整演示样例(二)
版权声明: https://blog.csdn.net/lfdfhl/article/details/27672913 MainActivity例如以下: package cc.c; import j ...
- Android平台调用Web Service:演示样例
近期在学习Android,随着移动设备的流行,当软件走上商业化的道路,为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛,懂点Andr ...
- Android SqlDelight具体解释和Demo样例
一.简单介绍 SQLDelight 和 SqlBrite 是 Square 公司推出的一个 Android 平台数据库解决方式. 在了解这个两个东西前,必须先得有Andorid的Sqlite的知识(S ...
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...
- Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)
导读 这篇文章中我不会使用概念性文字来说明装饰者模式.由于通常概念性的问题都非常抽象.非常难懂.使得读者非常难明确究竟为什么要使用这样的设计模式.我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了 ...
- Android 中 shape 图形的使用
转载于:http://kofi1122.blog.51cto.com/2815761/521605 Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shap ...
- Android清理设备内存具体完整演示样例(一)
MainActivity例如以下: package come.on; import android.app.Activity; import android.content.Context; impo ...
- 10个开发中常用的PHP代码样例
一.黑名单过滤 function is_spam($text, $file, $split = ':', $regex = false){ $handle = fopen($file, 'rb'); ...
- 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式
断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...
随机推荐
- static在C和C++中的用法和区别
static主要有三个作用: (1)局部静态变量 (2)外部静态变量/函数 (3)静态数据成员/成员函数 前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍: 一.局部静态变量 在C/C+ ...
- gdi+ 高速绘制透明窗体
gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...
- HDU 4424 Conquer a New Region 最大生成树
给你一颗树 每条边有一个权值 选择一个点为中心 定义S值为中心到其它n-1个点的路径上的最小边权 求全部点S值的和 从大到小排序 每次合并2棵树 设为A集合 B集合 设A集合的最大S值的和为sumA ...
- google2013校园招聘笔试题(全国)
google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...
- PL/SQL(二):变量
变量 标识符定义 PL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同.要求和限制有: 个字符. )首字符必须为字母. )不区分大小写. )不能使用SQL保留字. )对标识符的命名最好遵循 ...
- 《UNIX环境高级编程》笔记--read函数,write函数,lseek函数
1.read函数 调用read函数从文件去读数据,函数定义如下: #include <unistd.h> ssize_t read(int filedes, void* buff, siz ...
- poj 2299 逆序数
http://poj.org/problem?id=2299 坑:答案是long long 输出……!!!!! 题意是:求一个数组进行冒泡排序交换的次数 题解:求逆序数 题解Ⅰ: 归并排序求逆序数 归 ...
- jquery mobile切换页面的几种方法
jquery mobile切换页面的几种方法 - 不厚道青蛙之焦油潭 - 博客频道 - CSDN.NET jquery mobile切换页面的几种方法 分类: phonegap html5 2012- ...
- html5之拖放简单效果
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title> ...
- FZOJ2111:Min Number
Problem Description Now you are given one non-negative integer n in 10-base notation, it will only c ...