今天看了一下api中的画图,遇到了一个新的类,Shader类介绍,android中提供了Shader类专门来渲染图像已经一些几何图形,shader 下面包括几个直接子类,分别是BitmapShaper,ComposeShader,LinerGradient,RadialGradient,SweepGradient.BitmapShader主要用来渲染图像,Shader类的使用,先构造Shdaer对象,然后通过Paint的setShader方法来设置渲染对象,然后再绘制使用这个Paint对象既可。
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;
public class ShapeDrawble1 extends Activity {
/** Called when the activity is first created. */
@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() {
/* SweepGradient 是继承于Shader的,它是以中心点(150,25)
* 按照下列四种颜色进行变化的*/
return new SweepGradient(0, 0,
new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFF0000 },
null);// null 表示均衡变化
}
private static Shader makeLinear() {
//颜色按照直线线性变化的着色器
return new LinearGradient(100, 100, 0, 0,
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, 1, 1,
Bitmap.Config.ARGB_8888);
/**
* BitmapShader 是一个位图着色器,这个着色器是通过
* 在x,y方向重复位图bm的像素来着色的
*
*/
return new BitmapShader(bm, Shader.TileMode.REPEAT,
Shader.TileMode.REPEAT);
}
/**
* ShapeDrawable 是绘制各种几何体的类。它注入想要绘制的形状shap
* 类,就可以绘制出我们想要的集合体,这个类最寒心的就是draw(canvas)
* 和onDraw(Shape,Canvas,Paint)这个方法调用
*
*/
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;
}
}
}
}
分享到:
相关推荐
在这个"ShapeDrawable实例"中,我们将深入探讨如何利用Shape Drawable来创建各种自定义图形。 1. **Shape类型**: - **Rectange(矩形)**: 最基础的形状,可以通过设置`android:width`和`android:height`来定义...
本教程“Android图形开发实例”旨在帮助开发者深入理解和掌握Android图形系统,提升应用程序的视觉表现和用户体验。 一、Android图形系统基础 Android的图形系统主要基于OpenGL ES,一个为嵌入式设备设计的2D和3D...
ShapeDrawable资源; ClipDrawable资源; AnimationDrawable资源; 6.5、使用原始XML资源: 6.6、使用Layout资源: 6.7、使用菜单(Menu)资源: 6.8、样式(Style)和主题(Theme)资源: 6.9、属性(Attribute)资源:...
每个`item`标签内部可以是任意类型的Drawable,如BitmapDrawable、ShapeDrawable等。通过`android:gravity`和定位属性来控制每个Drawable的显示位置。 示例代码: ```xml <layer-list xmlns:android=...
对于这种类型的图片,Android 使用 Drawable 类及其子类 BitmapDrawable、ColorDrawable、ShapeDrawable 等类处理。 Drawable 类是 Android 系统中用于访问图片的重要类。使用 Drawable 类可以将图片保存在 res/...
Android提供了多种Drawable类型,包括BitmapDrawable(位图)、ShapeDrawable(形状)、LevelListDrawable(等级列表)和StateListDrawable(状态列表)等。自定义图片通常基于这些基础类型进行扩展,或者通过组合...
1. **视觉效果**:使用ShapeDrawable或Vector Asset创建类似iOS的输入框背景,设置圆角、描边宽度和颜色。同时,可以为EditText添加一个清除按钮(如上文所述)。 2. **光标效果**:iOS的UITextField有独特的光标...
3. 直接使用类构造函数:对于有经验的开发者,可以直接实例化Drawable子类并传入必要的参数。 例如,下面的代码展示了如何在布局中添加一个从资源加载的ImageView: ```java LinearLayout mLinearLayout; ...
本文将介绍如何在Android中快速绘制一个圆角矩形的实例,这对于美化界面和提供更为丰富的用户交互体验非常有帮助。 首先,需要了解Android系统提供的绘图API。在Android中,可以使用各种图形和视图来绘制二维图形。...
3. ShapeDrawable控件:在Android中,我们可以使用ShapeDrawable控件来定义按钮的形状。在这个示例中,我们使用了ShapeDrawable控件来定义按钮的圆角和边框效果。 4. SoundPool技术:在Android中,我们可以使用...
1. **初始化Scroller**:在需要使用Scroller的地方,先创建一个Scroller实例,通常会传入一个Interpolator(插值器),以定制滚动的速率和感觉。 2. **开始滚动**:当用户触发滑动手势时,开发者可以调用Scroller的...
2. **自定义阴影**:如果目标API级别低于21,或者需要更精确控制阴影,可以使用`LayerDrawable`结合`ShapeDrawable`来绘制阴影。首先创建一个矩形形状,然后调整渐变颜色和角度来模拟阴影效果。 ```xml ...
它可以是BitmapDrawable,也可以是ShapeDrawable、LevelListDrawable等其他类型的Drawable。Drawable主要用于视图的背景、按钮图像等,提供了统一的绘制和管理方法。例如,通过getDrawable(int id)方法,我们可以从...
1. 创建`ShapeDrawable`实例,定义形状和样式。 2. 将`ShapeDrawable`设置为View的背景,如ProgressBar。 3. 根据下载进度动态调整`ShapeDrawable`的尺寸或颜色。例如,随着下载进度增加,改变矩形的宽度或渐变的...
- **ShapeDrawable**: 用于绘制简单的几何形状,如矩形、圆形、线等。 - **LevelListDrawable**: 根据指定的级别显示不同的Drawable。 - **StateListDrawable**: 根据视图的状态(如按下、聚焦等)显示不同的...
- 如果使用Java代码动态设置,可以利用`ShapeDrawable`或者`CornerBitmapShader`等类来实现,通过改变`setCornerRadius()`方法的参数来调整圆角大小。 3. **自定义TabBar的使用步骤** - 引入库:首先,将`Richard...
"Android 仪表盘与圆形进度条开发案例"提供了一个实例,展示了如何在Android平台上实现动态、交互式的仪表盘和圆形进度条组件。这些组件通常用于显示数据的进度或者表示某种状态,如电池电量、加载进度等。 一、...
首先,你需要获取相机实例,这可以通过`CameraManager`类的`GetCameraIdList()`方法得到。然后,使用`OpenCamera()`方法打开选定的相机。接下来,设置`CameraCaptureSession`和`Surface`,以便相机可以将图像数据...