直接貼上代碼:
BasicViewDraw.java
Java代碼

- package com.view;
- import com.test.R;
- import android.view.View;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.RectF;
- import android.graphics.Path;
- import android.graphics.Shader;
- import android.graphics.LinearGradient;
- public class BasicViewDraw extends View {
- public BasicViewDraw(Context context) {
- super(context);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- canvas.drawColor(Color.WHITE);
- Paint paint = new Paint();
- paint.setAntiAlias(true);
- paint.setColor(Color.RED);
- paint.setStyle(Paint.Style.STROKE);
- paint.setStrokeWidth(3);
- canvas.drawCircle(40, 40, 30, paint);
- canvas.drawRect(10, 90, 70, 150, paint);
- canvas.drawRect(10, 170, 70, 200, paint);
- RectF re = new RectF(10, 220, 70, 250);
- canvas.drawOval(re, paint);
- Path path = new Path();
- path.moveTo(10, 330);
- path.lineTo(70, 330);
- path.lineTo(40, 270);
- path.close();//記得要close
- canvas.drawPath(path, paint);
- Path path1 = new Path();
- path1.moveTo(10, 410);
- path1.lineTo(70, 410);
- path1.lineTo(55, 350);
- path1.lineTo(25, 350);
- path1.close();
- canvas.drawPath(path1, paint);
- paint.setStyle(Paint.Style.FILL);
- paint.setColor(Color.BLUE);
- canvas.drawCircle(120, 40, 30, paint);
- canvas.drawRect(90, 90, 150, 150, paint);
- canvas.drawRect(90, 170, 150, 200, paint);
- RectF re2 = new RectF(90, 220, 150, 250);
- canvas.drawOval(re2, paint);
- Path path2 = new Path();
- path2.moveTo(90, 330);
- path2.lineTo(150, 330);
- path2.lineTo(120, 270);
- path2.close();
- canvas.drawPath(path2, paint);
- Path path3 = new Path();
- path3.moveTo(90, 410);
- path3.lineTo(150, 410);
- path3.lineTo(135, 350);
- path3.lineTo(105, 350);
- path3.close();
- canvas.drawPath(path3, paint);
- Shader mShader = new LinearGradient(0, 0, 100, 100, new int[] {
- Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null,
- Shader.TileMode.REPEAT);
- paint.setShader(mShader);
- canvas.drawCircle(200, 40, 30, paint);
- canvas.drawRect(170, 90, 230, 150, paint);
- canvas.drawRect(170, 170, 230, 200, paint);
- RectF re3 = new RectF(170, 220, 230, 250);
- canvas.drawOval(re3, paint);
- Path path4 = new Path();
- path4.moveTo(170, 330);
- path4.lineTo(230, 330);
- path4.lineTo(200, 270);
- path4.close();
- canvas.drawPath(path4, paint);
- Path path5 = new Path();
- path5.moveTo(170, 410);
- path5.lineTo(230, 410);
- path5.lineTo(215, 350);
- path5.lineTo(185, 350);
- path5.close();
- canvas.drawPath(path5, paint);
- paint.setTextSize(24);
- canvas.drawText(getResources().getString(R.string.str_text1), 240, 50,paint);
- canvas.drawText(getResources().getString(R.string.str_text2), 240, 120,paint);
- canvas.drawText(getResources().getString(R.string.str_text3), 240, 190,paint);
- canvas.drawText(getResources().getString(R.string.str_text4), 240, 250,paint);
- canvas.drawText(getResources().getString(R.string.str_text5), 240, 320,paint);
- canvas.drawText(getResources().getString(R.string.str_text6), 240, 390,paint);
- }
- }
package com.view;
import com.test.R;
import android.view.View;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Path;
import android.graphics.Shader;
import android.graphics.LinearGradient;
/* 自定義繼承View 的MyView*/
public class BasicViewDraw extends View {
public BasicViewDraw(Context context) {
super(context);
}
/* 重寫onDraw() */
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/* 設定背景為白色 */
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
/* 去鋸齒 */
paint.setAntiAlias(true);
/* 設定paint的顔色 */
paint.setColor(Color.RED);
/* 設定paint的 style 為STROKE:空心 */
paint.setStyle(Paint.Style.STROKE);
/* 設定paint的外框寬度 */
paint.setStrokeWidth(3);
/* 畫一個空心圓形 */
canvas.drawCircle(40, 40, 30, paint);
/* 畫一個空心正方形 */
canvas.drawRect(10, 90, 70, 150, paint);
/* 畫一個空心長方形 */
canvas.drawRect(10, 170, 70, 200, paint);
/* 畫一個空心橢圓形 */
RectF re = new RectF(10, 220, 70, 250);
canvas.drawOval(re, paint);
/* 畫一個空心三角形 */
Path path = new Path();
path.moveTo(10, 330);
path.lineTo(70, 330);
path.lineTo(40, 270);
path.close();//記得要close
canvas.drawPath(path, paint);
/* 畫一個空心梯形 */
Path path1 = new Path();
path1.moveTo(10, 410);
path1.lineTo(70, 410);
path1.lineTo(55, 350);
path1.lineTo(25, 350);
path1.close();
canvas.drawPath(path1, paint);
/* 設定paint 的style為 FILL:實心 */
paint.setStyle(Paint.Style.FILL);
/* 設定paint的顔色 */
paint.setColor(Color.BLUE);
/* 畫一個實心圓 */
canvas.drawCircle(120, 40, 30, paint);
/* 畫一個實心正方形 */
canvas.drawRect(90, 90, 150, 150, paint);
/* 畫一個實心長方形 */
canvas.drawRect(90, 170, 150, 200, paint);
/* 畫一個實心橢圓 */
RectF re2 = new RectF(90, 220, 150, 250);
canvas.drawOval(re2, paint);
/* 畫一個實心三角形 */
Path path2 = new Path();
path2.moveTo(90, 330);
path2.lineTo(150, 330);
path2.lineTo(120, 270);
path2.close();
canvas.drawPath(path2, paint);
/* 畫一個實心梯形 */
Path path3 = new Path();
path3.moveTo(90, 410);
path3.lineTo(150, 410);
path3.lineTo(135, 350);
path3.lineTo(105, 350);
path3.close();
canvas.drawPath(path3, paint);
/* 設定漸變色 */
Shader mShader = new LinearGradient(0, 0, 100, 100, new int[] {
Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null,
Shader.TileMode.REPEAT);
paint.setShader(mShader);
/* 畫一個漸變色圓 */
canvas.drawCircle(200, 40, 30, paint);
/* 畫一個漸變色正方形 */
canvas.drawRect(170, 90, 230, 150, paint);
/* 畫一個漸變色長方形 */
canvas.drawRect(170, 170, 230, 200, paint);
/* 畫一個漸變色橢圓 */
RectF re3 = new RectF(170, 220, 230, 250);
canvas.drawOval(re3, paint);
/* 畫一個漸變色三角形 */
Path path4 = new Path();
path4.moveTo(170, 330);
path4.lineTo(230, 330);
path4.lineTo(200, 270);
path4.close();
canvas.drawPath(path4, paint);
/* 畫一個漸變色梯形 */
Path path5 = new Path();
path5.moveTo(170, 410);
path5.lineTo(230, 410);
path5.lineTo(215, 350);
path5.lineTo(185, 350);
path5.close();
canvas.drawPath(path5, paint);
/* 寫字 */
paint.setTextSize(24);
canvas.drawText(getResources().getString(R.string.str_text1), 240, 50,paint);
canvas.drawText(getResources().getString(R.string.str_text2), 240, 120,paint);
canvas.drawText(getResources().getString(R.string.str_text3), 240, 190,paint);
canvas.drawText(getResources().getString(R.string.str_text4), 240, 250,paint);
canvas.drawText(getResources().getString(R.string.str_text5), 240, 320,paint);
canvas.drawText(getResources().getString(R.string.str_text6), 240, 390,paint);
}
}
BasicView2Draw.java
Java代碼

- class BasicView2Draw extends View{
- Paint paint;
- Bitmap bitmap;
- public BasicView2Draw(Context context) {
- super(context);
- paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
- }
- private Bitmap createBitmap1(){
- Bitmap bitmap1 = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap1);
- canvas.drawColor(Color.BLUE);
- // canvas.drawARGB(0, 0, 0, 0);// 透明色
- canvas.drawBitmap(bitmap, 0, 0, paint);
- canvas.drawText("Hello Android", 25, 55, paint);
- return bitmap1;
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- // 繪制位圖
- // 1.繪制位圖在(10,10)位置上
- canvas.drawBitmap(createBitmap1(), 10, 10, paint);
- // 2. canvas.drawBitmap(Bitmap bitmap,Rect src,Rect dest,Paint paint);
- // canvas.drawBitmap(Bitmap bitmap,Rect src,RectF dest,Paint paint);
- // 繪制位圖到一個指定的矩形dest中,位圖會自動進行平移和縮放等操作,如果src的參數不為null
- // 則會裁剪位圖的部分區域來進行繪制
- Rect rect = new Rect(10, 10, 50, 60);
- RectF rectF1 = new RectF(180.0f, 20.0f, 240.0f, 80.0f);
- RectF rectF2 = new RectF(180.0f, 100.0f, 240.0f, 160.0f);
- canvas.drawBitmap(createBitmap1(), null, rectF1, paint);
- canvas.drawBitmap(createBitmap1(), rect, rectF2, paint);
- // 點
- paint.setStyle(Paint.Style.FILL_AND_STROKE);
- paint.setStrokeWidth(5.0f);
- paint.setColor(Color.YELLOW);
- canvas.drawPoints(new float[]{120,120,140,140,160,160,180,180}, paint);
- // 線
- paint.reset();// 重置畫筆
- paint.setColor(Color.GREEN);
- paint.setAntiAlias(true);
- canvas.drawLine(30, 30, 130, 40, paint);
- paint.setColor(Color.RED);
- canvas.drawLines(new float[]{ 40,40,140,40 ,50,50,90,90 }, paint);
- // 矩形
- paint.setColor(Color.CYAN);
- canvas.drawRect(10, 150, 150, 250, paint);
- paint.setColor(Color.GRAY);
- canvas.drawRect(new Rect(10, 260, 150, 280), paint);
- paint.setColor(Color.DKGRAY);
- canvas.drawRect(new RectF(20.2f, 290.9f, 120.2f, 300.3f), paint);
- // 繪制文本
- // paint.setTextSize(20);
- // paint.setColor(0x40ffffff);// 半透明白色
- // paint.setTextAlign(Paint.Align.RIGHT);// 對齊方向
- // canvas.drawText("Cool Android", 250, 180, paint);// 這裡注意,坐标(180,180)是文本的左下點坐标
- // 畫布平移:
- // 平移的機關是像素,分别是在x,y軸上平移的像素點
- // 正數代表的正方向,x軸為平面的右側,y軸為平面的下方,相應的,負數則向反方向平移
- // canvas.translate(30.0f, 30.0f);
- // 畫布縮放:
- // 參數分别是在想x,y軸上放大或縮小的倍數,大雨1為放大,小于1為縮小,
- // 縮放的原點預設為畫布的原點(0,0),也可以指定縮放的原點
- // canvas.scale(2.0f, 1.5f);
- // canvas.scale(0.5f, 0.5f, 100.0f, 100.0f);// 指定坐标(100.0f,100.0f)為縮放原點
- // 這裡剖析一下第二個縮放方法,其實系統為我們做的事情是這樣的
- // 畫布旋轉
- // 1.以畫布為原點,順時針旋轉40.0f度
- // canvas.rotate(40.0f);
- // 2.以(100.11f, 100.22f)為原點,順時針旋轉50.0f度
- // canvas.rotate(50.0f, 100.11f, 100.22f);
- // 相應的,為了加深了解,我們再剖析一下第二個旋轉方法
- // ,其實系統為我們做的事情是這樣的
- // 畫布傾斜
- // skew(float sx,float xy);将畫布在x及y軸方向上傾斜相應的角度,sx或sy為傾斜角度的tan值,
- // 如canvas.skew(1,0);為在x方向上傾斜45度 >> tan(45) = 1
- // canvas.skew(1,0);
- }
- }
class BasicView2Draw extends View{
Paint paint;
Bitmap bitmap;
public BasicView2Draw(Context context) {
super(context);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
}
private Bitmap createBitmap1(){
Bitmap bitmap1 = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap1);
canvas.drawColor(Color.BLUE);
// canvas.drawARGB(0, 0, 0, 0);// 透明色
canvas.drawBitmap(bitmap, 0, 0, paint);
canvas.drawText("Hello Android", 25, 55, paint);
return bitmap1;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 繪制位圖
// 1.繪制位圖在(10,10)位置上
canvas.drawBitmap(createBitmap1(), 10, 10, paint);
// 2. canvas.drawBitmap(Bitmap bitmap,Rect src,Rect dest,Paint paint);
// canvas.drawBitmap(Bitmap bitmap,Rect src,RectF dest,Paint paint);
// 繪制位圖到一個指定的矩形dest中,位圖會自動進行平移和縮放等操作,如果src的參數不為null
// 則會裁剪位圖的部分區域來進行繪制
Rect rect = new Rect(10, 10, 50, 60);
RectF rectF1 = new RectF(180.0f, 20.0f, 240.0f, 80.0f);
RectF rectF2 = new RectF(180.0f, 100.0f, 240.0f, 160.0f);
canvas.drawBitmap(createBitmap1(), null, rectF1, paint);
canvas.drawBitmap(createBitmap1(), rect, rectF2, paint);
// 點
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setStrokeWidth(5.0f);
paint.setColor(Color.YELLOW);
canvas.drawPoints(new float[]{120,120,140,140,160,160,180,180}, paint);
// 線
paint.reset();// 重置畫筆
paint.setColor(Color.GREEN);
paint.setAntiAlias(true);
canvas.drawLine(30, 30, 130, 40, paint);
paint.setColor(Color.RED);
canvas.drawLines(new float[]{ 40,40,140,40 ,50,50,90,90 }, paint);
// 矩形
paint.setColor(Color.CYAN);
canvas.drawRect(10, 150, 150, 250, paint);
paint.setColor(Color.GRAY);
canvas.drawRect(new Rect(10, 260, 150, 280), paint);
paint.setColor(Color.DKGRAY);
canvas.drawRect(new RectF(20.2f, 290.9f, 120.2f, 300.3f), paint);
// 繪制文本
// paint.setTextSize(20);
// paint.setColor(0x40ffffff);// 半透明白色
// paint.setTextAlign(Paint.Align.RIGHT);// 對齊方向
// canvas.drawText("Cool Android", 250, 180, paint);// 這裡注意,坐标(180,180)是文本的左下點坐标
// 畫布平移:
// 平移的機關是像素,分别是在x,y軸上平移的像素點
// 正數代表的正方向,x軸為平面的右側,y軸為平面的下方,相應的,負數則向反方向平移
// canvas.translate(30.0f, 30.0f);
// 畫布縮放:
// 參數分别是在想x,y軸上放大或縮小的倍數,大雨1為放大,小于1為縮小,
// 縮放的原點預設為畫布的原點(0,0),也可以指定縮放的原點
// canvas.scale(2.0f, 1.5f);
// canvas.scale(0.5f, 0.5f, 100.0f, 100.0f);// 指定坐标(100.0f,100.0f)為縮放原點
// 這裡剖析一下第二個縮放方法,其實系統為我們做的事情是這樣的
/*
scale(float sx, float sy, float px, float py){
translate(px,py);
scale(sx,sy);
translate(-px,-py);
}
*/
// 畫布旋轉
// 1.以畫布為原點,順時針旋轉40.0f度
// canvas.rotate(40.0f);
// 2.以(100.11f, 100.22f)為原點,順時針旋轉50.0f度
// canvas.rotate(50.0f, 100.11f, 100.22f);
// 相應的,為了加深了解,我們再剖析一下第二個旋轉方法
// ,其實系統為我們做的事情是這樣的
/*
rotate(float degrees, float px, float py){
translate(px,py);
rotate(degrees);
translate(-px,-py);
}
*/
// 畫布傾斜
// skew(float sx,float xy);将畫布在x及y軸方向上傾斜相應的角度,sx或sy為傾斜角度的tan值,
// 如canvas.skew(1,0);為在x方向上傾斜45度 >> tan(45) = 1
// canvas.skew(1,0);
}
}
ClipRectDraw.java
Java代碼

- package com.view;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Path;
- import android.graphics.Region;
- import android.util.AttributeSet;
- import android.view.View;
- public class ClipRectDraw extends View {
- Context context;
- Paint paint;
- Path path;
- public ClipRectDraw(Context context) {
- super(context);
- init();
- }
- public ClipRectDraw(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- public ClipRectDraw(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- init();
- }
- private void init(){
- paint = new Paint();
- paint.setAntiAlias(true);
- paint.setStrokeWidth(5);
- paint.setTextSize(15);
- paint.setTextAlign(Paint.Align.RIGHT);
- path = new Path();
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- canvas.drawColor(Color.GRAY);
- //左上圖
- canvas.save();
- canvas.translate(10, 10);
- drawScene(canvas);
- canvas.restore();
- //右上圖
- canvas.save();
- canvas.translate(160, 10);
- canvas.clipRect(10, 10, 90, 90);
- canvas.clipRect(30, 30, 70, 70, Region.Op.XOR);
- drawScene(canvas);
- canvas.restore();
- //左中圖
- canvas.save();
- canvas.translate(10, 130);
- path.reset();
- path.cubicTo(0, 0, 100, 0, 100, 100);
- path.cubicTo(100, 100, 0, 100, 0, 0);
- canvas.clipPath(path, Region.Op.REPLACE);
- drawScene(canvas);
- canvas.restore();
- //右中圖
- canvas.save();
- canvas.translate(160, 130);
- canvas.clipRect(0, 0, 60, 60);
- canvas.clipRect(40, 40, 100, 100, Region.Op.UNION);
- drawScene(canvas);
- canvas.restore();
- //左下圖
- canvas.save();
- canvas.translate(10, 250);
- canvas.clipRect(0, 0, 60, 60);
- canvas.clipRect(40, 40, 100, 100, Region.Op.XOR);
- drawScene(canvas);
- canvas.restore();
- //右下圖
- canvas.translate(160, 250);
- canvas.clipRect(0, 0, 60, 60);
- canvas.clipRect(40, 40, 100, 100, Region.Op.REVERSE_DIFFERENCE);
- drawScene(canvas);
- canvas.restore();
- }
- private void drawScene(Canvas canvas){
- canvas.clipRect(0, 0, 100, 100);
- canvas.drawColor(Color.WHITE);
- paint.setColor(Color.RED);
- canvas.drawLine(0, 0, 100, 100, paint);
- paint.setColor(Color.GREEN);
- canvas.drawCircle(30, 70, 30, paint);
- paint.setColor(Color.BLUE);
- canvas.drawText("ChenJianLi", 100, 30, paint);
- }
- }
package com.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Region;
import android.util.AttributeSet;
import android.view.View;
/**
* ---------------------------------------------------矩形區域-------------------------------------------------
* canvas.clipRect(左上角x軸坐标, 左上角y軸坐标, 右下角x軸坐标, 右下角y軸坐标, Region.Op.XOR);
* 最後一個參數有多個選擇分别是:
* //DIFFERENCE是第一次不同于第二次的部分顯示出來
//REPLACE是顯示第二次的
//REVERSE_DIFFERENCE 是第二次不同于第一次的部分顯示
//INTERSECT:交集顯示
//UNION:全部顯示
//XOR補集,就是全集的減去交集剩餘部分顯示
* @author emmet1988.iteye.com
*
*/
public class ClipRectDraw extends View {
Context context;
Paint paint;
Path path;
public ClipRectDraw(Context context) {
super(context);
init();
}
public ClipRectDraw(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ClipRectDraw(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init(){
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
paint.setTextSize(15);
paint.setTextAlign(Paint.Align.RIGHT);
path = new Path();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GRAY);
//左上圖
canvas.save();
canvas.translate(10, 10);
drawScene(canvas);
canvas.restore();
//右上圖
canvas.save();
canvas.translate(160, 10);
canvas.clipRect(10, 10, 90, 90);
canvas.clipRect(30, 30, 70, 70, Region.Op.XOR);
drawScene(canvas);
canvas.restore();
//左中圖
canvas.save();
canvas.translate(10, 130);
path.reset();
/*抛物曲線*/
path.cubicTo(0, 0, 100, 0, 100, 100);
path.cubicTo(100, 100, 0, 100, 0, 0);
canvas.clipPath(path, Region.Op.REPLACE);
drawScene(canvas);
canvas.restore();
//右中圖
canvas.save();
canvas.translate(160, 130);
canvas.clipRect(0, 0, 60, 60);
canvas.clipRect(40, 40, 100, 100, Region.Op.UNION);
drawScene(canvas);
canvas.restore();
//左下圖
canvas.save();
canvas.translate(10, 250);
canvas.clipRect(0, 0, 60, 60);
canvas.clipRect(40, 40, 100, 100, Region.Op.XOR);
drawScene(canvas);
canvas.restore();
//右下圖
canvas.translate(160, 250);
canvas.clipRect(0, 0, 60, 60);
canvas.clipRect(40, 40, 100, 100, Region.Op.REVERSE_DIFFERENCE);
drawScene(canvas);
canvas.restore();
}
private void drawScene(Canvas canvas){
canvas.clipRect(0, 0, 100, 100);
canvas.drawColor(Color.WHITE);
paint.setColor(Color.RED);
canvas.drawLine(0, 0, 100, 100, paint);
paint.setColor(Color.GREEN);
canvas.drawCircle(30, 70, 30, paint);
paint.setColor(Color.BLUE);
canvas.drawText("ChenJianLi", 100, 30, paint);
}
}
MatrixDraw.java
Java代碼

- package com.view;
- import com.test.R;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.Canvas;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- import android.graphics.drawable.BitmapDrawable;
- import android.view.View;
- public class MatrixDraw extends View implements Runnable{
- Bitmap bitmap;
- Matrix matrix = new Matrix();
- Paint paint;
- public MatrixDraw(Context context) {
- super(context);
- bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap();
- paint = new Paint();
- paint.setAntiAlias(true);
- new Thread(this).start();
- }
- float m;
- float n;
- @Override
- protected void onDraw(Canvas canvas) {
- n ++;
- if (n == 60) {
- n = 0;
- }
- matrix.postRotate(n);
- matrix.postTranslate(n, n);
- matrix.postScale(1, 1, n, n);
- canvas.drawBitmap(bitmap, matrix, paint);
- }
- @Override
- public void run() {
- while(!Thread.currentThread().isInterrupted()){
- try {
- Thread.sleep(100);
- postInvalidate();
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
- }
- }
package com.view;
import com.test.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;
/**
* 在 Android 裡面, Matrix 由 9 個 float 值構成,是一個 3*3 的矩陣。
* cosX, -sinX,translateX
* sinX, cosX,translateY
* 0, 0, scale
* 解釋一下,上面的 sinX 和 cosX ,表示旋轉角度的 cos 值和 sin 值,注意,
* 旋轉角度是按順時針方向計算的。 translateX 和 translateY 表示 x 和 y 的平移量。
* scale 是縮放的比例, 1 是不變, 2 是表示縮放 1/2 ,
* @author emmet1988.iteye.com
*
*/
public class MatrixDraw extends View implements Runnable{
Bitmap bitmap;
Matrix matrix = new Matrix();
Paint paint;
public MatrixDraw(Context context) {
super(context);
bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap();
paint = new Paint();
paint.setAntiAlias(true);
new Thread(this).start();
}
float m;
float n;
@Override
protected void onDraw(Canvas canvas) {
/*
float cosValue = (float)Math.cos(-Math.PI/m);
float sinValue = (float)Math.sin(-Math.PI/m);
Log.d("matrixdraw", "Math.PI =" + Math.PI);
Log.d("matrixdraw", "Math.PI/m =" + Math.PI/m);
Log.d("matrixdraw", "Math.cos(-Math.PI/m) =" + (float)Math.cos(-Math.PI/m));
Log.d("matrixdraw", "Math.sin(-Math.PI/m) =" + (float)Math.sin(-Math.PI/m));
matrix.setValues(new float[]{
cosValue,-sinValue,100,
sinValue,cosValue,100,
0, 0, 2
});//舉例,若縮放值為0.9,代表放大原圖的十分之一
// super.onDraw(canvas);//當然,如果界面上還有其他元素需要繪制,隻需要将這句話寫上就行了。
// Matrix matrix2 = new Matrix(matrix);
canvas.drawBitmap(bitmap, matrix, paint);
// canvas.drawBitmap(bitmap, matrix2, paint);
*/
n ++;
if (n == 60) {
n = 0;
}
matrix.postRotate(n);
matrix.postTranslate(n, n);
matrix.postScale(1, 1, n, n);
canvas.drawBitmap(bitmap, matrix, paint);
}
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()){
try {
Thread.sleep(100);
postInvalidate();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
/**
* 以左上角為頂點,縮放一半,逆時針旋轉30度,
* 然後沿x軸和y軸分别平移50個像素,
* 代碼 裡面寫的是100,為什麼是平移50呢,
* 因為縮放了一半。
* 大家可以自己設定一下Matrix的值,或者嘗試一下兩個
* Matrix相乘,得到的值設定進去,
* 這樣才能對Matrix更加熟練。
*/
}
Matrix2Draw.java
Java代碼

- public class Matrix2Draw extends View {
- private Bitmap mBitmap;
- private Matrix mMatrix = new Matrix();
- public Matrix2Draw(Context context) {
- super(context);
- initialize();
- }
- private void initialize() {
- Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap();
- mBitmap = bmp;
- mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());
- // pre 方式:前乘 >> 參數給出的矩陣乘以目前的矩陣。是以操作是在目前矩陣的最前面發生的。
- //平移到(100,100)處
- mMatrix.preTranslate(100, 100);
- //傾斜x和y軸,以(100,100)為中心。
- mMatrix.preSkew(0.2f, 0.2f, 100, 100);
- }
- @Override protected void onDraw(Canvas canvas) {
- // super.onDraw(canvas); //如果界面上還有其他元素需要繪制,隻需要将這句話寫上就行了。
- Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- canvas.drawBitmap(mBitmap, mMatrix, paint);
- }
- }
public class Matrix2Draw extends View {
private Bitmap mBitmap;
private Matrix mMatrix = new Matrix();
public Matrix2Draw(Context context) {
super(context);
initialize();
}
private void initialize() {
Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap();
mBitmap = bmp;
/*首先,将縮放為100*100。這裡scale的參數是比例。有一點要注意,如果直接用100/
bmp.getWidth()的話,會得到0,因為是整型相除,是以必須其中有一個是float型的,
直接用100f就好。*/
mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());
/*// post 方式:後乘 >> 目前的矩陣乘以參數給出的矩陣。可以連續多次使用post,來完成所需的整個變換。
//平移到(100,100)處
mMatrix.postTranslate(100, 100);
//傾斜x和y軸,以(100,100)為中心。
mMatrix.postSkew(0.2f, 0.2f, 100, 100);*/
// pre 方式:前乘 >> 參數給出的矩陣乘以目前的矩陣。是以操作是在目前矩陣的最前面發生的。
//平移到(100,100)處
mMatrix.preTranslate(100, 100);
//傾斜x和y軸,以(100,100)為中心。
mMatrix.preSkew(0.2f, 0.2f, 100, 100);
}
@Override protected void onDraw(Canvas canvas) {
// super.onDraw(canvas); //如果界面上還有其他元素需要繪制,隻需要将這句話寫上就行了。
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
canvas.drawBitmap(mBitmap, mMatrix, paint);
}
}
/**
Matrix的操作:
總共分為translate(平移),rotate(旋轉),scale(縮放)和skew(傾斜)四種,每一種變換在
Android的API裡都提供了set, post和pre三種操作方式,除了translate,其他三種操作都可以指定中心點。
set是直接設定Matrix的值,每次set一次,整個Matrix的數組都會變掉。
post是後乘,目前的矩陣乘以參數給出的矩陣。可以連續多次使用post,來完成所需的整個變換。
pre是前乘,參數給出的矩陣乘以目前的矩陣。是以操作是在目前矩陣的最前面發生的。
旋轉、縮放和傾斜都可以圍繞一個中心點來進行,如果不指定,預設情況下,是圍繞(0,0)點來進行。
*/
SimpleDraw.java
Java代碼

- package com.view;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Rect;
- import android.view.View;
- public class SimpleDraw extends View implements Runnable {
- private Paint paint;
- public SimpleDraw(Context context) {
- super(context);
- paint = new Paint();
- new Thread(this).start();
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- canvas.drawColor(Color.GRAY);//
- paint.setAntiAlias(true);//
- canvas.save();//
- canvas.clipRect(10, 10, 110, 110);//
- canvas.drawColor(Color.WHITE);//
- // canvas.rotate(m);//以螢幕左上角為坐标原點旋轉
- m += 45.0f;
- if (m == 360.0f) {
- m = 0.0f;
- }
- canvas.rotate(m, 60, 60);// 以(60,60)為原點旋轉
- paint.setColor(Color.GREEN);
- canvas.drawRect(new Rect(50, 50, 70, 70), paint);
- canvas.restore();
- canvas.save();
- canvas.translate(140, 10);
- canvas.clipRect(0, 0, 100, 100);// 一定要先剪輯出矩形區域再設畫布背景,
- //否則會覆寫整張畫布
- canvas.drawColor(Color.BLACK);
- paint.setColor(Color.BLUE);
- canvas.drawRect(new Rect(10, 10, 50, 50), paint);
- canvas.restore();
- //
- canvas.save();
- canvas.translate(120, 120);
- canvas.clipRect(new Rect(0, 0, 100, 100));
- canvas.drawColor(Color.GREEN);
- // paint.setColor(Color.BLUE);
- paint.setStrokeWidth(4);
- paint.setColor(Color.BLACK);
- canvas.drawLine(0, 60, 100, 60, paint);
- paint.setARGB(255, 51, 51, 51);
- paint.setTextSize(20);
- paint.setFlags(Paint.ANTI_ALIAS_FLAG);
- paint.setUnderlineText(true);
- // paint.setFlags(Paint.UNDERLINE_TEXT_FLAG);
- canvas.drawText("陳建立", 25, 80, paint);
- paint.setColor(Color.WHITE);
- canvas.drawRect(new Rect(10, 10, 50, 50), paint);
- canvas.restore();
- }
- float m = 0.0f;
- public void run() {
- while (!Thread.currentThread().isInterrupted()) {
- try {
- Thread.sleep(500);// 每半秒執行一次
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- postInvalidate();
- }
- }
- }
package com.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.View;
public class SimpleDraw extends View implements Runnable {
/*
* 我們繼續來介紹Android平台底層繪圖類的相關内容,在Android UI開發專題(一)
* 之界面設計中我們介紹了有關Android平台資源使用以及Bitmap相關類的操作
* ,接下來将會以執行個體的方式給大家示範各種類的用處以及注意點。今天我們繼續
* 了解android.graphics包中比較重要的繪圖類。
*
* 一、 android.graphics.Matrix有關圖形的變換、縮放等相關操作常用的方法有:
* Java代碼: void reset() // 重置一個matrix對象。
* void set(Matrix src) //複制一個源矩陣,和本類的構造方法 Matrix(Matrix src) 一樣
* boolean isIdentity() //傳回這個矩陣是否定義(已經有意義)
* void setRotate(float degrees) //指定一個角度以0,0為坐标進行旋轉
* void setRotate(float degrees, float px, float py) //指定一個角度以px,py為坐标進行旋轉
* void setScale(float sx, float sy) // 縮放
* void setScale(float sx, float sy, float px, float py) //以坐标px,py進行縮放
* void setTranslate(float dx, float dy) //平移
* void setSkew (float kx, float ky, float px, float py) //以坐标px,py進行傾斜
* void setSkew (float kx, float ky) //傾斜 複制代碼 二、android.graphics.NinePatch
*
* NinePatch是Android平台特有的一種非矢量圖形自然拉伸處理方法,可以幫助正常的
* 圖形在拉伸時不會縮放,
* 執行個體中Android開發網提示大家對于Toast的顯示就是該原理,同時SDK中提供了一
* 個工具名為Draw
* 9-Patch,有關該工具的使用方法可以參考我們經釋出的 Draw
* 9-Patch使用方法介紹一文。由于該類提供了高品質支援透明的縮放方式,是以圖形
* 格式為PNG,檔案命名方式為.9.png
* 的字尾比如eoeandroid。
*
* 三、android.graphics.Paint。Paint類我們可以了解為畫筆、畫刷的屬性定義,本類
* 常用的方法如下:
*
* Java代碼: void reset() //重置
* void setARGB(int a, int r, int g, int b) 或 void setColor(int color)
* //均為設定Paint對象的顔色
* void setAntiAlias(boolean aa)
*
* //是否抗鋸齒,需要配合void setFlags (Paint.ANTI_ALIAS_FLAG) 來幫助消除鋸齒
* 使其邊緣更平滑。
* Shader setShader(Shader shader)
*
* //設定陰影,Shader類是一個矩陣對象,如果為NULL将清除陰影。
* void setStyle(Paint.Style style) //設定樣式,一般為 FILL 填充,或者STROKE凹陷
* 效果。
* void setTextSize(float textSize) //設定字型大小
* void setTextAlign(Paint.Align align) //文本對齊方式
* Typeface setTypeface(Typeface typeface)
* //設定字型,通過Typeface可以加載Android内部的字型,一般為宋體對于中文,
* 部分ROM可以自己添加比如雅黑等等
* void setUnderlineText(boolean underlineText)
*
* //是否設定下劃線,需要撇和void setFlags (Paint.UNDERLINE_TEXT_FLAG) 方法。 複制代碼
* 四、android.graphics.Rect
*
* Rect我們可以了解為矩形區域,類似的還有Point一個點,Rect類除了表示一個矩
* 形區域位置描述外,
* eoeandroid提示主要可以幫助我們計算圖形之間是否碰撞
* (包含)關系,對于Android遊戲開發比較有用,其主要的成員contains包含了三種
* 重載方法,來判斷包含關系.
*
* Java代碼:
* boolean contains(int left, int top, int right, int bottom)
* boolean contains(int x, int y)
*
* boolean contains(Rect r) 複制代碼 五、android.graphics.Region
* Region在Android平台中表示一個區域和Rect不同的是
* ,它表示的是一個不規則的樣子,可以是橢圓、多邊形等等,而Rect僅僅是矩形。
* 同樣Region的boolean contains(int x,
* int y) 成員可以判斷一個點是否在該區域内。
*
* 六、android.graphics.Typeface
* Typeface類是幫助描述一個字型對象,在TextView中通過使用setTypeface方法來
* 制定一個輸出文本的字型
* ,其直接構造調用成員create方法可以直接指定一個字型名稱和樣式,比如
* Java代碼: static Typeface create(Typeface family, int style)
*
* static Typeface create(String familyName, int style) 複制代碼
* 同時使用isBold和isItalic方法可以判斷出是否包含粗體或斜體的字型。
*
* Java代碼: final boolean isBold()
* final boolean isItalic() 複制代碼 該類的建立方法還有從apk的資源或從一個具體的
* 檔案路徑,其具體方法為
* Java代碼: static Typeface createFromAsset(AssetManager mgr, String path)
* static Typeface createFromFile(File path)
* static Typeface createFromFile(String path) 複制代碼
*/
private Paint paint;
public SimpleDraw(Context context) {
super(context);
paint = new Paint();
new Thread(this).start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GRAY);//
paint.setAntiAlias(true);//
canvas.save();//
canvas.clipRect(10, 10, 110, 110);//
canvas.drawColor(Color.WHITE);//
// canvas.rotate(m);//以螢幕左上角為坐标原點旋轉
m += 45.0f;
if (m == 360.0f) {
m = 0.0f;
}
canvas.rotate(m, 60, 60);// 以(60,60)為原點旋轉
paint.setColor(Color.GREEN);
canvas.drawRect(new Rect(50, 50, 70, 70), paint);
canvas.restore();
canvas.save();
canvas.translate(140, 10);
canvas.clipRect(0, 0, 100, 100);// 一定要先剪輯出矩形區域再設畫布背景,
//否則會覆寫整張畫布
canvas.drawColor(Color.BLACK);
paint.setColor(Color.BLUE);
canvas.drawRect(new Rect(10, 10, 50, 50), paint);
canvas.restore();
//
canvas.save();
canvas.translate(120, 120);
canvas.clipRect(new Rect(0, 0, 100, 100));
canvas.drawColor(Color.GREEN);
// paint.setColor(Color.BLUE);
paint.setStrokeWidth(4);
paint.setColor(Color.BLACK);
canvas.drawLine(0, 60, 100, 60, paint);
paint.setARGB(255, 51, 51, 51);
paint.setTextSize(20);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setUnderlineText(true);
// paint.setFlags(Paint.UNDERLINE_TEXT_FLAG);
canvas.drawText("陳建立", 25, 80, paint);
paint.setColor(Color.WHITE);
canvas.drawRect(new Rect(10, 10, 50, 50), paint);
canvas.restore();
}
float m = 0.0f;
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(500);// 每半秒執行一次
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
postInvalidate();
}
}
}
TextDraw.java
Java代碼

- package com.view;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Paint.FontMetrics;
- import android.util.Log;
- import android.view.View;
- public class TextDraw extends View {
- public TextDraw(Context context) {
- super(context);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG);
- textPaint.setTextSize( 35);
- textPaint.setColor( Color.WHITE);
- // FontMetrics
- FontMetrics fontMetrics = textPaint.getFontMetrics();
- String text = "abcdefghijklm";
- //
- float baseX = 0;
- float baseY = 100;
- Log.d("textDraw", "top = "+fontMetrics.top+
- "ascent = "+fontMetrics.ascent+
- "descent = "+fontMetrics.descent+
- "bottom = "+fontMetrics.bottom+"\n");
- float topY = baseY + fontMetrics.top;
- float ascentY = baseY + fontMetrics.ascent;
- float descentY = baseY + fontMetrics.descent;
- float bottomY = baseY + fontMetrics.bottom;
- Log.d("textDraw", "topY = "+topY+
- "ascentY = "+ascentY+
- "descentY = "+descentY+
- "bottomY = "+bottomY);
- //
- canvas.drawText( text, baseX, baseY, textPaint);
- // BaseLine
- Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
- baseLinePaint.setColor( Color.RED);
- canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);
- // Base
- canvas.drawCircle( baseX, baseY, 5, baseLinePaint);
- // TopLine
- Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
- topLinePaint.setColor( Color.LTGRAY);
- canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);
- // AscentLine
- Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
- ascentLinePaint.setColor( Color.GREEN);
- canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);
- // DescentLine
- Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
- descentLinePaint.setColor( Color.YELLOW);
- canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);
- // ButtomLine
- Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
- bottomLinePaint.setColor( Color.MAGENTA);
- canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);
- }
- }
package com.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.util.Log;
import android.view.View;
public class TextDraw extends View {
public TextDraw(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize( 35);
textPaint.setColor( Color.WHITE);
// FontMetrics
FontMetrics fontMetrics = textPaint.getFontMetrics();
String text = "abcdefghijklm";
//
float baseX = 0;
float baseY = 100;
Log.d("textDraw", "top = "+fontMetrics.top+
"ascent = "+fontMetrics.ascent+
"descent = "+fontMetrics.descent+
"bottom = "+fontMetrics.bottom+"\n");
float topY = baseY + fontMetrics.top;
float ascentY = baseY + fontMetrics.ascent;
float descentY = baseY + fontMetrics.descent;
float bottomY = baseY + fontMetrics.bottom;
Log.d("textDraw", "topY = "+topY+
"ascentY = "+ascentY+
"descentY = "+descentY+
"bottomY = "+bottomY);
//
canvas.drawText( text, baseX, baseY, textPaint);
// BaseLine
Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
baseLinePaint.setColor( Color.RED);
canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);
// Base
canvas.drawCircle( baseX, baseY, 5, baseLinePaint);
// TopLine
Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
topLinePaint.setColor( Color.LTGRAY);
canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);
// AscentLine
Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
ascentLinePaint.setColor( Color.GREEN);
canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);
// DescentLine
Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
descentLinePaint.setColor( Color.YELLOW);
canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);
// ButtomLine
Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
bottomLinePaint.setColor( Color.MAGENTA);
canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);
}
}
RoundAndReflectionDraw.java
Java代碼

- class RoundImageView extends View {
- private Bitmap bitmap;
- int bitmapWidth;
- int bitmapHeight;
- public RoundImageView(Context context) {
- super(context);
- bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.rotate_surfaceview);
- bitmapWidth = bitmap.getWidth();
- bitmapHeight = bitmap.getHeight();
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- // 第一種方法:
- // 第二種方法:
- Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- paint.setColor(0xffffffff);
- paint.setTextSize(15);
- canvas.drawText("生成帶圓角的圖檔", 10, 25, paint);
- canvas.drawBitmap(getRoundedCornerBitmap(bitmap), 10, 30, paint);
- canvas.drawText("生成帶倒影的圖檔", 170, 160, paint);
- canvas.drawBitmap(createReflectionImageWithOrigin(bitmap), 170, 165, paint);
- }
- public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
- // 建立一個指定寬度和高度的空位圖對象
- Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888);
- // 用該位圖建立畫布
- Canvas canvas = new Canvas(output);
- // 畫筆對象
- final Paint paint = new Paint();
- // 畫筆的顔色
- final int color = 0xff424242;
- // 矩形區域對象
- final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
- // 未知
- final RectF rectF = new RectF(rect);
- // 拐角的半徑
- final float roundPx = 12;
- // 消除鋸齒
- 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, rect, rect, paint);
- // 最終在畫布上呈現的就是該圓角矩形圖檔,然後我們傳回該Bitmap對象
- return output;
- }
- //獲得帶倒影的圖檔方法
- public Bitmap createReflectionImageWithOrigin(Bitmap bitmap){
- // 圖檔與倒影之間的距離間隔
- final int reflectionGap = 2;
- // 原圖的寬度
- int width = bitmap.getWidth();
- // 原圖的高度
- int height = bitmap.getHeight();
- // 圖檔旋轉,縮放等控制對象
- Matrix matrix = new Matrix();
- // 縮放(這裡pre,set,post三種效果是不一樣的,注意差別)
- matrix.preScale(1, -1);
- // 建立一個初始的倒影位圖
- Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height/2, width, height/2, matrix, false);
- // 建立一個寬度為原圖寬度,高度為原圖高度的3/2的位圖,用于繪制新的位圖,即整體的效果圖位圖對象
- Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);
- // 由該位圖對象建立初始畫布(規定了畫布的寬高)
- Canvas canvas = new Canvas(bitmapWithReflection);
- // 在該畫布上繪制原圖
- canvas.drawBitmap(bitmap, 0, 0, null);
- // 建立一個畫筆
- Paint deafalutPaint = new Paint();
- // 繪制一個矩形區域,該矩形區域便是原圖和倒影圖之間的間隔圖
- canvas.drawRect(0, height,width,height + reflectionGap,deafalutPaint);
- // 繪制該倒影圖于間隔圖的下方
- canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
- // 建立一個畫筆
- Paint paint = new Paint();
- // 建立一個線性漸變對象
- LinearGradient shader = new LinearGradient(
- 0, bitmap.getHeight(),
- 0, bitmapWithReflection.getHeight() + reflectionGap,
- 0x70ffffff, 0x00ffffff,
- TileMode.CLAMP
- );
- // 把漸變效果應用在畫筆上
- paint.setShader(shader);
- // Set the Transfer mode to be porter duff and destination in
- // 未知
- paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
- // Draw a rectangle using the paint with our linear gradient
- // 繪制出該漸變效果,也就是最終的倒影效果圖
- canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);
- // 傳回
- return bitmapWithReflection;
- }
- }
class RoundImageView extends View {
private Bitmap bitmap;
int bitmapWidth;
int bitmapHeight;
public RoundImageView(Context context) {
super(context);
bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.rotate_surfaceview);
bitmapWidth = bitmap.getWidth();
bitmapHeight = bitmap.getHeight();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 第一種方法:
/*Bitmap roundBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight,Bitmap.Config.ARGB_8888);
canvas = new Canvas(roundBitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLUE);
canvas.drawRoundRect(new RectF(0, 0, bitmapWidth, bitmapHeight),20.0f, 20.0f, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.drawBitmap(roundBitmap, 0, 0, paint);*/
// 第二種方法:
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(0xffffffff);
paint.setTextSize(15);
canvas.drawText("生成帶圓角的圖檔", 10, 25, paint);
canvas.drawBitmap(getRoundedCornerBitmap(bitmap), 10, 30, paint);
canvas.drawText("生成帶倒影的圖檔", 170, 160, paint);
canvas.drawBitmap(createReflectionImageWithOrigin(bitmap), 170, 165, paint);
}
public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
// 建立一個指定寬度和高度的空位圖對象
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888);
// 用該位圖建立畫布
Canvas canvas = new Canvas(output);
// 畫筆對象
final Paint paint = new Paint();
// 畫筆的顔色
final int color = 0xff424242;
// 矩形區域對象
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
// 未知
final RectF rectF = new RectF(rect);
// 拐角的半徑
final float roundPx = 12;
// 消除鋸齒
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, rect, rect, paint);
// 最終在畫布上呈現的就是該圓角矩形圖檔,然後我們傳回該Bitmap對象
return output;
}
//獲得帶倒影的圖檔方法
public Bitmap createReflectionImageWithOrigin(Bitmap bitmap){
// 圖檔與倒影之間的距離間隔
final int reflectionGap = 2;
// 原圖的寬度
int width = bitmap.getWidth();
// 原圖的高度
int height = bitmap.getHeight();
// 圖檔旋轉,縮放等控制對象
Matrix matrix = new Matrix();
// 縮放(這裡pre,set,post三種效果是不一樣的,注意差別)
matrix.preScale(1, -1);
/**
set是直接設定Matrix的值,每次set一次,整個Matrix的數組都會變掉。
post是後乘,目前的矩陣乘以參數給出的矩陣。可以連續多次使用post,
來完成所需的整個變換。例如,要将一個圖檔旋
轉30度,然後平移到(100,100)的地方,那麼可以這樣做:
Matrix m = new Matrix();
m.postRotate(30);
m.postTranslate(100, 100);
這樣就達到了想要的效果。
pre是前乘,參數給出的矩陣乘以目前的矩陣。是以操作是在目前矩陣的最前面發生的。
例如上面的例子,如果用pre的話,就要這樣:
Matrix m = new Matrix();
m.setTranslate(100, 100);
m.preRotate(30);
旋轉、縮放和傾斜都可以圍繞一個中心點來進行,如果不指定,預設情況下,
是圍繞(0,0)點來進行。
關于縮放:
scale的參數是比例。例如,我們縮放為100%,則有一點要注意,如果直接用
100/bmp.getWidth()的話,會得到0,因為是整型相除,是以必須其中有一個是
float型的,直接用100f就好 。
如:matrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());
*/
// 建立一個初始的倒影位圖
Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height/2, width, height/2, matrix, false);
// 建立一個寬度為原圖寬度,高度為原圖高度的3/2的位圖,用于繪制新的位圖,即整體的效果圖位圖對象
Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);
// 由該位圖對象建立初始畫布(規定了畫布的寬高)
Canvas canvas = new Canvas(bitmapWithReflection);
// 在該畫布上繪制原圖
canvas.drawBitmap(bitmap, 0, 0, null);
// 建立一個畫筆
Paint deafalutPaint = new Paint();
// 繪制一個矩形區域,該矩形區域便是原圖和倒影圖之間的間隔圖
canvas.drawRect(0, height,width,height + reflectionGap,deafalutPaint);
// 繪制該倒影圖于間隔圖的下方
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
// 建立一個畫筆
Paint paint = new Paint();
// 建立一個線性漸變對象
LinearGradient shader = new LinearGradient(
0, bitmap.getHeight(),
0, bitmapWithReflection.getHeight() + reflectionGap,
0x70ffffff, 0x00ffffff,
TileMode.CLAMP
);
// 把漸變效果應用在畫筆上
paint.setShader(shader);
// Set the Transfer mode to be porter duff and destination in
// 未知
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// Draw a rectangle using the paint with our linear gradient
// 繪制出該漸變效果,也就是最終的倒影效果圖
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);
// 傳回
return bitmapWithReflection;
}
}
/**
* 繪制圓角背景以及圖檔圓角的處理
.配置檔案實作
<?xml version="1.0" encoding="utf-8"?>
<layer-list
* xmlns:android="http://schemas.android.com/apk/res/android"> <item
* android:drawable="@drawable/icon_home_button_img"/> <item
* android:drawable="@drawable/icon_home_shape_overlay"/>
* </layer-list>
* icon_home_shape_overlay如下
* <?xml version="1.0" encoding="utf-8"?>
* <shape
* xmlns:android="http://schemas.android.com/apk/res/android"> <solid
* android:color="#60000000"/>
* <stroke android:width="3dp"
* color="#ff000000"/>
* <corners android:radius="10dp" />
* </shape>
* 或者直接使用一種效果
* <?xml version="1.0" encoding="UTF-8"?>
* <shape
* xmlns:android="http://schemas.android.com/apk/res/android">
* <solid
* android:color="#99FFFFFF"/>
* <corners android:radius="30px"/>
* <padding
* android:left="0dp" android:top="0dp" android:right="0dp"
* android:bottom="0dp" />
* </shape>
* 然後
* android:background="@drawable/my_shape_file"
*
*
* 2.圖檔本身加上圓角 Bitmap myCoolBitmap = ... ; // <-- Your bitmap you want rounded
*
* int w = myCoolBitmap.getWidth(), h = myCoolBitmap.getHeight();
* Bitmap rounder = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888); Canvas
* canvas = new Canvas(rounder);
*
* Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
* xferPaint.setColor(Color.RED);
*
* canvas.drawRoundRect(new RectF(0,0,w,h), 20.0f, 20.0f, xferPaint);
*
* xferPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
* canvas.drawBitmap(myCoolBitmap, 0,0, null);
* canvas.drawBitmap(rounder, 0,0, xferPaint);
* 或者
* public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
* Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
* bitmap.getHeight(), Config.ARGB_8888);
* Canvas canvas = newCanvas(output);
*
* final int color = 0xff424242; final Paint paint = new Paint(); final Rect
* rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF
* rectF = new RectF(rect); final float roundPx = 12;
*
* 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, rect, rect, paint);
*
* return output;
* }
*/
SurfaceViewDraw.java
Java代碼

- package com.view;
- import com.test.R;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- import android.graphics.Rect;
- import android.util.Log;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class SurfaceViewDraw extends SurfaceView implements Runnable,SurfaceHolder.Callback {
- private Bitmap backgroundBitmap;
- private Bitmap rotateBitmap;
- SurfaceHolder surfaceHolder;
- public SurfaceViewDraw(Context context) {
- super(context);
- backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background_surfaceview);
- rotateBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rotate_surfaceview);
- surfaceHolder = this.getHolder();
- surfaceHolder.addCallback(this);
- }
- public void surfaceCreated(SurfaceHolder holder) {
- new Thread(this).start();
- Log.d("surfaceview", "surfaceCreated");
- }
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- Log.d("surfaceview", "surfaceChanged");
- }
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.d("surfaceview", "surfaceDestroyed");
- }
- @Override
- public void run() {
- Log.d("surfaceview", "run");
- Canvas canvas = null;
- int rotateValue = 0;//旋轉角度
- int frameCount = 0;//幀計數器
- while (!Thread.currentThread().isInterrupted()) {
- try {
- // canvas = surfaceHolder.lockCanvas();//擷取畫布對象(擷取整個螢幕的畫布)
- canvas = surfaceHolder.lockCanvas(new Rect(10, 10, 240, 250));//擷取某個區域的畫布
- Paint paint = new Paint();
- Log.d("surfaceview", "rotateValue " +rotateValue+"|frameCount "+frameCount);
- if (frameCount++ < 2) {//僅在第一次繪制時繪制背景
- canvas.drawBitmap(backgroundBitmap, 0, 0, paint);//繪制背景
- }
- //建立矩陣以控制圖檔的旋轉和平移
- Matrix matrix = new Matrix();
- rotateValue += 40;
- matrix.setRotate(rotateValue, rotateBitmap.getWidth()/2, rotateBitmap.getHeight()/2);
- // matrix.postRotate(rotateValue, rotateBitmap.getWidth()/2, rotateBitmap.getHeight()/2);
- // matrix.setTranslate(100, rotateValue);
- if (rotateValue == 360) {
- rotateValue = 0;
- }
- matrix.setTranslate(80,50);//設定左邊距和上邊距
- //繪制問号
- Log.d("surfaceview", "canvas "+canvas);
- Log.d("surfaceview", "rotateBitmap "+rotateBitmap);
- Log.d("surfaceview", "matrix "+matrix);
- Log.d("surfaceview", "paint "+paint);
- if (canvas != null) {
- canvas.drawBitmap(rotateBitmap, matrix, paint);
- //解鎖畫布,送出畫好的圖像
- surfaceHolder.unlockCanvasAndPost(canvas);
- }
- Thread.sleep(30);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- Log.d("surfaceview", "InterruptedException");
- } finally {
- Log.d("surfaceview", "finally");
- }
- }
- }
- }