原文:http://blog.sina.com.cn/s/blog_9f7feef1010155f4.html
android ShapeDrawable實例
- 關於ShapeDrawable的使用,分爲兩個部分
- 一、是使用已經存在的ShapeDrawable子類
- (1)首先聲明ShapeDrawable對象,有子類實例化。
- (2)設置ShapeDrawable對象的Color或者Shader,Shader是一個渲染圖形的類
- (3)在View中的onDraw()方法中,利用ShapeDrawable.setBounds()方法設置繪圖區域,ShapeDrawable.draw(Canvas)把ShapeDrawable對象畫到畫布的指定位置
- 二、重新構造自己的ShapeDrawable子類
- 必須重寫onDraw()方法。其他的如上
關於ShapeDrawable的使用,分爲兩個部分
一、是使用已經存在的ShapeDrawable子類
(1)首先聲明ShapeDrawable對象,有子類實例化。
(2)設置ShapeDrawable對象的Color或者Shader,Shader是一個渲染圖形的類
(3)在View中的onDraw()方法中,利用ShapeDrawable.setBounds()方法設置繪圖區域,ShapeDrawable.draw(Canvas)把ShapeDrawable對象畫到畫布的指定位置
二、重新構造自己的ShapeDrawable子類
必須重寫onDraw()方法。其他的如上
- 其他的一些可以看註釋,所有的都在這個文件中就傳工程了。
其他的一些可以看註釋,所有的都在這個文件中就傳工程了。
- package com.example.test;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapShader;
- import android.graphics.Canvas;
- import android.graphics.ComposePathEffect;
- import android.graphics.CornerPathEffect;
- import android.graphics.DiscretePathEffect;
- import android.graphics.LinearGradient;
- import android.graphics.Paint;
- import android.graphics.Path;
- import android.graphics.PathEffect;
- import android.graphics.RectF;
- import android.graphics.Shader;
- import android.graphics.SweepGradient;
- import android.graphics.drawable.Drawable;
- import android.graphics.drawable.ShapeDrawable;
- import android.graphics.drawable.shapes.ArcShape;
- import android.graphics.drawable.shapes.OvalShape;
- import android.graphics.drawable.shapes.PathShape;
- import android.graphics.drawable.shapes.RectShape;
- import android.graphics.drawable.shapes.RoundRectShape;
- import android.graphics.drawable.shapes.Shape;
- import android.os.Bundle;
- import android.view.View;
- /*
- * 關於ShapeDrawable的使用,分爲兩個部分
- * 一、是使用已經存在的ShapeDrawable子類
- * (1)首先聲明ShapeDrawable對象,有子類實例化。
- * (2)設置ShapeDrawable對象的Color或者Shader,Shader是一個渲染圖形的類
- * (3)在View中的onDraw()方法中,利用ShapeDrawable.setBounds()方法設置繪圖區域
- * ShapeDrawable.draw(Canvas)把ShapeDrawable對象畫到畫布的指定位置
- * 二、重新構造自己的ShapeDrawable子類
- * 必須重寫onDraw()方法。其他的如上
- */
- public class ShapeDrawble1 extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(new SampleView(this));
- }
- private static class SampleView extends View {
- private ShapeDrawable[] mDrawables;
- private static Shader makeSweep() {
- return new SweepGradient(150, 25, new int[] { 0xFFFF0000,
- 0xFF00FF00, 0xFF0000FF, 0xFFFF0000 }, null);// null 表示均衡變化
- }
- private static Shader makeLinear() {
- // 顏色按照直線線性變化的着色器
- return new LinearGradient(0, 0, 50, 50, new int[] { 0xFFFF0000,
- 0xFF00FF00, 0xFF0000FF }, null, Shader.TileMode.MIRROR);
- }
- private static Shader makeTiling() {
- int[] pixels = new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0 };
- Bitmap bm = Bitmap.createBitmap(pixels, 2, 2,
- Bitmap.Config.ARGB_8888);
- return new BitmapShader(bm, Shader.TileMode.REPEAT,
- Shader.TileMode.REPEAT);
- }
- private static class MyShapeDrawable extends ShapeDrawable {
- // Paint.ANTI_ALIAS_FLAG代表這個畫筆的圖形是光滑的
- private Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- public MyShapeDrawable(Shape s) {
- super(s);
- mStrokePaint.setStyle(Paint.Style.STROKE);
- }
- public Paint getStrokePaint() {
- return mStrokePaint;
- }
- @Override
- protected void onDraw(Shape s, Canvas c, Paint p) {
- // 繪製填充效果的圖形
- s.draw(c, p);
- // 繪製黑邊
- s.draw(c, mStrokePaint);
- }
- }
- public SampleView(Context context) {
- super(context);
- setFocusable(true);
- // 外部圓角矩形的圓角圓半徑,上面倆個角是圓
- float[] outerR = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
- // 內部矩形,用於設置外部的矩形和內部矩形之間的距離,第一個參數設置左邊
- //第二個參數設置上邊,第三個設置右邊,第四個參數設置下邊
- RectF inset = new RectF(6, 6, 6,6);
- // 內部圓角矩形的圓角是圓半徑,左上角和右下角是圓角矩形
- float[] innerR = new float[] { 12, 12, 0, 0, 12, 12, 0, 0 };
- // 繪製一個頂點爲下列四個點的棱形
- Path path = new Path();
- path.moveTo(50, 0);
- path.lineTo(0, 50);
- path.lineTo(50, 100);
- path.lineTo(100, 50);
- // 封閉前面點所繪製的路徑
- path.close();
- mDrawables = new ShapeDrawable[7];
- // 繪製矩形
- mDrawables[0] = new ShapeDrawable(new RectShape());
- // 繪製橢圓
- mDrawables[1] = new ShapeDrawable(new OvalShape());
- // 繪製上面倆個角是圓角的矩形
- mDrawables[2] = new ShapeDrawable(new RoundRectShape(outerR, null,
- null));
- // 繪製上面倆角是圓角,並且有一個內嵌的矩形
- mDrawables[3] = new ShapeDrawable(new RoundRectShape(outerR, inset,
- null));
- // //繪製上面倆角是圓角,並且有一個內嵌的矩形且左上角和右下角是圓形矩形環
- mDrawables[4] = new ShapeDrawable(new RoundRectShape(outerR, inset,
- innerR));
- // 繪製指定路徑的集合體
- mDrawables[5] = new ShapeDrawable(new PathShape(path, 100, 100));
- // 用自定的ShapDrawble繪製開始弧度45掃過弧度-270的橢圓
- mDrawables[6] = new MyShapeDrawable(new ArcShape(45, -270));
- mDrawables[0].getPaint().setColor(0xFFFF0000);
- mDrawables[1].getPaint().setColor(0xFF00FF00);
- mDrawables[2].getPaint().setColor(0xFF0000FF);
- mDrawables[3].getPaint().setShader(makeSweep());
- mDrawables[4].getPaint().setShader(makeLinear());
- mDrawables[5].getPaint().setShader(makeTiling());
- mDrawables[6].getPaint().setColor(0x88FF8844);
- // DiscretePathEffect是一個折線路徑效果,分割長度是10,偏差時4
- PathEffect pe = new DiscretePathEffect(10, 4);
- // CornerPathEffect是將2個路徑效果合併後的路徑效果
- PathEffect pe2 = new CornerPathEffect(4);
- mDrawables[3].getPaint().setPathEffect(
- new ComposePathEffect(pe2, pe));
- MyShapeDrawable msd = (MyShapeDrawable) mDrawables[6];
- // 設置筆畫寬度等於4
- msd.getStrokePaint().setStrokeWidth(4);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- int x = 10;
- int y = 10;
- int width = 300;
- int height = 50;
- // 循環繪製
- for (Drawable dr : mDrawables) {
- dr.setBounds(x, y, x + width, y + height);
- dr.draw(canvas);
- y += height + 5;
- }
- }
- }
- }
package com.example.test;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ComposePathEffect;
import android.graphics.CornerPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.ArcShape;
import android.graphics.drawable.shapes.OvalShape;
import android.graphics.drawable.shapes.PathShape;
import android.graphics.drawable.shapes.RectShape;
import android.graphics.drawable.shapes.RoundRectShape;
import android.graphics.drawable.shapes.Shape;
import android.os.Bundle;
import android.view.View;
/*
* 關於ShapeDrawable的使用,分爲兩個部分
* 一、是使用已經存在的ShapeDrawable子類
* (1)首先聲明ShapeDrawable對象,有子類實例化。
* (2)設置ShapeDrawable對象的Color或者Shader,Shader是一個渲染圖形的類
* (3)在View中的onDraw()方法中,利用ShapeDrawable.setBounds()方法設置繪圖區域
* ShapeDrawable.draw(Canvas)把ShapeDrawable對象畫到畫布的指定位置
* 二、重新構造自己的ShapeDrawable子類
* 必須重寫onDraw()方法。其他的如上
*/
public class ShapeDrawble1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}
private static class SampleView extends View {
private ShapeDrawable[] mDrawables;
private static Shader makeSweep() {
return new SweepGradient(150, 25, new int[] { 0xFFFF0000,
0xFF00FF00, 0xFF0000FF, 0xFFFF0000 }, null);// null 表示均衡變化
}
private static Shader makeLinear() {
// 顏色按照直線線性變化的着色器
return new LinearGradient(0, 0, 50, 50, new int[] { 0xFFFF0000,
0xFF00FF00, 0xFF0000FF }, null, Shader.TileMode.MIRROR);
}
private static Shader makeTiling() {
int[] pixels = new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0 };
Bitmap bm = Bitmap.createBitmap(pixels, 2, 2,
Bitmap.Config.ARGB_8888);
return new BitmapShader(bm, Shader.TileMode.REPEAT,
Shader.TileMode.REPEAT);
}
private static class MyShapeDrawable extends ShapeDrawable {
// Paint.ANTI_ALIAS_FLAG代表這個畫筆的圖形是光滑的
private Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
public MyShapeDrawable(Shape s) {
super(s);
mStrokePaint.setStyle(Paint.Style.STROKE);
}
public Paint getStrokePaint() {
return mStrokePaint;
}
@Override
protected void onDraw(Shape s, Canvas c, Paint p) {
// 繪製填充效果的圖形
s.draw(c, p);
// 繪製黑邊
s.draw(c, mStrokePaint);
}
}
public SampleView(Context context) {
super(context);
setFocusable(true);
// 外部圓角矩形的圓角圓半徑,上面倆個角是圓
float[] outerR = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
// 內部矩形,用於設置外部的矩形和內部矩形之間的距離,第一個參數設置左邊
//第二個參數設置上邊,第三個設置右邊,第四個參數設置下邊
RectF inset = new RectF(6, 6, 6,6);
// 內部圓角矩形的圓角是圓半徑,左上角和右下角是圓角矩形
float[] innerR = new float[] { 12, 12, 0, 0, 12, 12, 0, 0 };
// 繪製一個頂點爲下列四個點的棱形
Path path = new Path();
path.moveTo(50, 0);
path.lineTo(0, 50);
path.lineTo(50, 100);
path.lineTo(100, 50);
// 封閉前面點所繪製的路徑
path.close();
mDrawables = new ShapeDrawable[7];
// 繪製矩形
mDrawables[0] = new ShapeDrawable(new RectShape());
// 繪製橢圓
mDrawables[1] = new ShapeDrawable(new OvalShape());
// 繪製上面倆個角是圓角的矩形
mDrawables[2] = new ShapeDrawable(new RoundRectShape(outerR, null,
null));
// 繪製上面倆角是圓角,並且有一個內嵌的矩形
mDrawables[3] = new ShapeDrawable(new RoundRectShape(outerR, inset,
null));
// //繪製上面倆角是圓角,並且有一個內嵌的矩形且左上角和右下角是圓形矩形環
mDrawables[4] = new ShapeDrawable(new RoundRectShape(outerR, inset,
innerR));
// 繪製指定路徑的集合體
mDrawables[5] = new ShapeDrawable(new PathShape(path, 100, 100));
// 用自定的ShapDrawble繪製開始弧度45掃過弧度-270的橢圓
mDrawables[6] = new MyShapeDrawable(new ArcShape(45, -270));
mDrawables[0].getPaint().setColor(0xFFFF0000);
mDrawables[1].getPaint().setColor(0xFF00FF00);
mDrawables[2].getPaint().setColor(0xFF0000FF);
mDrawables[3].getPaint().setShader(makeSweep());
mDrawables[4].getPaint().setShader(makeLinear());
mDrawables[5].getPaint().setShader(makeTiling());
mDrawables[6].getPaint().setColor(0x88FF8844);
// DiscretePathEffect是一個折線路徑效果,分割長度是10,偏差時4
PathEffect pe = new DiscretePathEffect(10, 4);
// CornerPathEffect是將2個路徑效果合併後的路徑效果
PathEffect pe2 = new CornerPathEffect(4);
mDrawables[3].getPaint().setPathEffect(
new ComposePathEffect(pe2, pe));
MyShapeDrawable msd = (MyShapeDrawable) mDrawables[6];
// 設置筆畫寬度等於4
msd.getStrokePaint().setStrokeWidth(4);
}
@Override
protected void onDraw(Canvas canvas) {
int x = 10;
int y = 10;
int width = 300;
int height = 50;
// 循環繪製
for (Drawable dr : mDrawables) {
dr.setBounds(x, y, x + width, y + height);
dr.draw(canvas);
y += height + 5;
}
}
}
}