Apidemo 学习 Regions RoundRects ScaleToFit

来源:互联网 发布:淘宝点击量和访客数 编辑:程序博客网 时间:2024/04/24 01:49
import android.graphics.*;import android.os.Bundle;import android.view.View;/** * 还是绘制图案的相交区域. 有四种 */public class Regions extends GraphicsActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(new SampleView(this));    }    private static class SampleView extends View {        private final Paint mPaint = new Paint();        private final Rect  mRect1 = new Rect();        private final Rect  mRect2 = new Rect();        public SampleView(Context context) {            super(context);            setFocusable(true);            mPaint.setAntiAlias(true);            mPaint.setTextSize(16);            mPaint.setTextAlign(Paint.Align.CENTER);            mRect1.set(10, 10, 100, 80);            mRect2.set(50, 50, 130, 110);        }        private void drawOriginalRects(Canvas canvas, int alpha) {            mPaint.setStyle(Paint.Style.STROKE);            mPaint.setColor(Color.RED);            mPaint.setAlpha(alpha);            drawCentered(canvas, mRect1, mPaint);            mPaint.setColor(Color.BLUE);            mPaint.setAlpha(alpha);            drawCentered(canvas, mRect2, mPaint);            // restore style            mPaint.setStyle(Paint.Style.FILL);        }        private void drawRgn(Canvas canvas, int color, String str, Region.Op op) {            if (str != null) {                mPaint.setColor(Color.BLACK);                canvas.drawText(str, 80, 24, mPaint);            }            Region rgn = new Region();            rgn.set(mRect1);//1 和 2 以什么样的形式进行 合并  一个region可以理解为 一些 rect的集合            rgn.op(mRect2, op);            mPaint.setColor(color);            RegionIterator iter = new RegionIterator(rgn); //迭代 region中 一共有几个 rect            Rect r = new Rect();            canvas.translate(0, 30);            mPaint.setColor(color);            while (iter.next(r)) {                canvas.drawRect(r, mPaint);            }            drawOriginalRects(canvas, 0x80);        }        private static void drawCentered(Canvas c, Rect r, Paint p) {            float inset = p.getStrokeWidth() * 0.5f;            if (inset == 0) {   // catch hairlines                inset = 0.5f;            }            c.drawRect(r.left + inset, r.top + inset,                       r.right - inset, r.bottom - inset, p);        }        @Override        protected void onDraw(Canvas canvas) {            canvas.drawColor(Color.GRAY);            canvas.save();            canvas.translate(80, 5);            drawOriginalRects(canvas, 0xFF);            canvas.restore();            mPaint.setStyle(Paint.Style.FILL);            canvas.save();            canvas.translate(0, 140);            drawRgn(canvas, Color.RED, "Union", Region.Op.UNION);            canvas.restore();            canvas.save();            canvas.translate(0, 280);            drawRgn(canvas, Color.BLUE, "Xor", Region.Op.XOR);            canvas.restore();            canvas.save();            canvas.translate(160, 140);            drawRgn(canvas, Color.GREEN, "Difference", Region.Op.DIFFERENCE);            canvas.restore();            canvas.save();            canvas.translate(160, 280);            drawRgn(canvas, Color.WHITE, "Intersect", Region.Op.INTERSECT);            canvas.restore();        }    }}


public class RoundRects extends GraphicsActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(new SampleView(this));    }    private static class SampleView extends View {        private Path    mPath;        private Paint   mPaint;        private Rect    mRect;        private GradientDrawable mDrawable;         public SampleView(Context context) {            super(context);            setFocusable(true);            mPath = new Path();            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);            mRect = new Rect(0, 0, 120, 120);            mDrawable = new GradientDrawable(GradientDrawable.Orientation.TL_BR,                                             new int[] { 0xFFFF0000, 0xFF00FF00,                                                 0xFF0000FF });            mDrawable.setShape(GradientDrawable.RECTANGLE);            mDrawable.setGradientRadius((float)(Math.sqrt(2) * 60));        }        //设置圆角的半径        static void setCornerRadii(GradientDrawable drawable, float r0,                                   float r1, float r2, float r3) {            drawable.setCornerRadii(new float[] { r0, r0, r1, r1,                                                  r2, r2, r3, r3 });        }        @Override protected void onDraw(Canvas canvas) {            mDrawable.setBounds(mRect);            float r = 16;            canvas.save();            canvas.translate(10, 10);            mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);//线性渐变            setCornerRadii(mDrawable, r, r, 0, 0);            mDrawable.draw(canvas);            canvas.restore();            canvas.save();            canvas.translate(10 + mRect.width() + 10, 10);            mDrawable.setGradientType(GradientDrawable.RADIAL_GRADIENT);//从圆心放射渐变            setCornerRadii(mDrawable, 0, 0, r, r);            mDrawable.draw(canvas);            canvas.restore();            canvas.translate(0, mRect.height() + 10);            canvas.save();            canvas.translate(10, 10);            mDrawable.setGradientType(GradientDrawable.SWEEP_GRADIENT);//中间有个尖 不知道怎么描述            setCornerRadii(mDrawable, 0, r, r, 0);            mDrawable.draw(canvas);            canvas.restore();            canvas.save();            canvas.translate(10 + mRect.width() + 10, 10);            mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);//线性渐变             setCornerRadii(mDrawable, r, 0, 0, r);            mDrawable.draw(canvas);            canvas.restore();            canvas.translate(0, mRect.height() + 10);            canvas.save();            canvas.translate(10, 10);            mDrawable.setGradientType(GradientDrawable.RADIAL_GRADIENT);            setCornerRadii(mDrawable, r, 0, r, 0);            mDrawable.draw(canvas);            canvas.restore();            canvas.save();            canvas.translate(10 + mRect.width() + 10, 10);            mDrawable.setGradientType(GradientDrawable.SWEEP_GRADIENT);            setCornerRadii(mDrawable, 0, r, 0, r);            mDrawable.draw(canvas);            canvas.restore();        }    }}


import android.graphics.*;import android.os.Bundle;import android.view.View;/** * 把图案 放到 一个方框中 */public class ScaleToFit extends GraphicsActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(new SampleView(this));    }    private static class SampleView extends View {        private final Paint   mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        private final Paint   mHairPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        private final Paint   mLabelPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        private final Matrix  mMatrix = new Matrix();        private final RectF   mSrcR = new RectF();        private static final Matrix.ScaleToFit[] sFits =                new Matrix.ScaleToFit[] {            Matrix.ScaleToFit.FILL,            Matrix.ScaleToFit.START,            Matrix.ScaleToFit.CENTER,            Matrix.ScaleToFit.END        };        private static final String[] sFitLabels = new String[] {            "FILL", "START", "CENTER", "END"        };        private static final int[] sSrcData = new int[] {            80, 40, Color.RED,            40, 80, Color.GREEN,            30, 30, Color.BLUE,            80, 80, Color.BLACK        };        private static final int N = 4;        private static final int WIDTH = 52;        private static final int HEIGHT = 52;        private final RectF mDstR = new RectF(0, 0, WIDTH, HEIGHT);        public SampleView(Context context) {            super(context);            mHairPaint.setStyle(Paint.Style.STROKE);            mLabelPaint.setTextSize(16);        }        private void setSrcR(int index) {            int w = sSrcData[index*3 + 0];            int h = sSrcData[index*3 + 1];            mSrcR.set(0, 0, w, h);        }        private void drawSrcR(Canvas canvas, int index) {            mPaint.setColor(sSrcData[index*3 + 2]);            canvas.drawOval(mSrcR, mPaint);        }        private void drawFit(Canvas canvas, int index, Matrix.ScaleToFit stf) {            canvas.save();            setSrcR(index);            mMatrix.setRectToRect(mSrcR, mDstR, stf); //在方框中绘制的四种方式,和imageview比较相似             canvas.concat(mMatrix);            drawSrcR(canvas, index);            canvas.restore();            canvas.drawRect(mDstR, mHairPaint);        }        @Override        protected void onDraw(Canvas canvas) {            canvas.drawColor(Color.WHITE);            canvas.translate(10, 10);            canvas.save();            for (int i = 0; i < N; i++) {//绘制开始的那四个图形                setSrcR(i);                drawSrcR(canvas, i);                canvas.translate(mSrcR.width() + 15, 0);            }            canvas.restore();            canvas.translate(0, 100);            for (int j = 0; j < sFits.length; j++) {                canvas.save();                for (int i = 0; i < N; i++) {                    drawFit(canvas, i, sFits[j]);                    canvas.translate(mDstR.width() + 8, 0); //移动到相应位置                }                canvas.drawText(sFitLabels[j], 0, HEIGHT*2/3, mLabelPaint);                canvas.restore();                canvas.translate(0, 80);            }        }    }}