Android Api Demos登顶之路(七十六)Graphics-->ShapeDrawable
2015-09-20 15:14
501 查看
/* * 这篇demon演示了如何在代码中绘制图形,用到了ShapeDrawable类 */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); } private class SampleView extends View { private ShapeDrawable[] mDrawables; /* shader类可以为画笔定制笔刷效果,可以是单色,可以是渐变,也可以是图片 */ // 定制扫描渐变 private Shader makeSweep() { return new SweepGradient(150, 25, new int[] { 0xffff0000, 0xff00ff00, 0xff0000ff }, null); } //线性渐变笔刷 private Shader makeLine() { return new LinearGradient(0, 0, 50, 50, new int[] { 0xffff0000, 0xff00ff00, 0xff0000ff }, null, Shader.TileMode.MIRROR); } //图片效果笔刷 private 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); } public SampleView(Context context) { super(context); setFocusable(true); //定义圆角矩形外边框四个边角的弧度,前两个参数表示左上,后面两个表示右上,接着左下、右下 float[] outR=new float[]{12,12,12,12,0,0,0,0}; //外部矩形与内部矩形四条边的间距。在一个矩形内部,再扣去一个矩形,得到一个矩形环的图形。 //inset就定义了这个矩形环四个边的宽度 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(outR, null, null)); mDrawables[3]=new ShapeDrawable(new RoundRectShape(outR, inset, null)); mDrawables[4]=new ShapeDrawable(new RoundRectShape(outR, inset, innerR)); //mDrawables[5]=new ShapeDrawable(new OvalShape()); mDrawables[5]=new ShapeDrawable(new PathShape(path, 100, 100)); //绘制一个弧形 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(makeLine()); mDrawables[5].getPaint().setShader(makeTiling()); mDrawables[6].getPaint().setColor(0x88ff8844); //定义路径(边框)的特效 //打散Path的线段,使得在原来路径的基础上发生打散效果。第一个参数表示最大的段长, //第二个参数表示偏离量 PathEffect pe=new DiscretePathEffect(10, 4); //将Path的各个连接线段之间的夹角用一种更平滑的方式连接,类似于圆弧与切线的效果。 PathEffect pe2=new CornerPathEffect(4); mDrawables[3].getPaint().setPathEffect(new ComposePathEffect(pe2, pe)); MyShapeDrawable msd=(MyShapeDrawable) mDrawables[6]; msd.getStrokePaint().setStrokeWidth(4); } @Override protected void onDraw(Canvas canvas) { int x=10; int y=10; int width=300; int height=50; for(ShapeDrawable sd:mDrawables){ sd.setBounds(x, y, x+width, y+height); sd.draw(canvas); y=y+height+5; } } //自定义一个ShapeDrawable private class MyShapeDrawable extends ShapeDrawable{ 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 shape, Canvas canvas, Paint paint) { //先画图形再描边 shape.draw(canvas, paint); shape.draw(canvas, mStrokePaint); } } } }
相关文章推荐
- Android AIDL技术详解
- Handler的绑定过程
- Android开源框架Volley
- Android 开源框架xUtil
- 安装Android Studio遇到的问题及解决方案
- 《第一行代码Android》笔记
- Android三种播放视频的方式
- Android权限判断checkPermission
- Android动画Animation
- Android防止按钮连续点击
- Android中的Environment.getExternalStorageState使用
- Android调用手机摄像头使用MediaRecorder录像并播放
- Android manifest文件中的标签详细介绍
- android 注销
- Android四大组件及Android组件管理者——Manifest文件
- 10个Android下拉刷新控件收集
- Android基础入门教程——2.4.3 BaseAdapter优化
- 10个Android下拉刷新控件收集
- 超炫Android-ConvenientBanner轻松实现广告头效果
- 2015Android移动开发应用主流菜单模式