当前位置: 代码迷 >> Android >> android ShapeDrawable范例
  详细解决方案

android ShapeDrawable范例

热度:47   发布时间:2016-05-01 15:50:07.0
android ShapeDrawable实例

? 今天看了一下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;	            }	        }	    }	}

?

1 楼 dengrui0917 2011-11-22  
最近我也要做一个将图片压缩成气泡状的图片,下载研究一下
  相关解决方案