• android绘图—Paint path 旋转


    http://meteor6789.blog.163.com/blog/static/35040733201111193535153/

     
     

    Piant

    看一段代码:

             mPaint = new Paint();
            mPaint.setAntiAlias(true);//锯齿
            mPaint.setDither(true);//
            mPaint.setColor(0xFF385078);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);//文档上的大概意思是设置连接处
            mPaint.setStrokeCap(Paint.Cap.ROUND);//文档上的大概意思是设置帽子 帽子应该是:比如画一条直线,那么cap就是指直线的头Or顶端

            mPaint.setStrokeWidth(20);//画笔的粗细

    样式 :

     paint有可以直接画一个矩形、各种圆、三角形等的方法,但是没有设置笔触样式的方法,所以如果想在paint上绑定一个图形,可以参考一下方法:

    import android.content.Context;
    import android.graphics.*;
    import android.graphics.Path.Direction;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;

    public class FingerPaint extends GraphicsActivity
            implements ColorPickerDialog.OnColorChangedListener {   

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(new MyView(this));

            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setDither(true);
            mPaint.setColor(0xFF385078);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
            mPaint.setStrokeCap(Paint.Cap.ROUND);
            mPaint.setStrokeWidth(20);
           
            mEmboss = new EmbossMaskFilter(new float[] { 0, 1, 1},
                                           0.2f, 6, 3.5f);

            mBlur = new BlurMaskFilter(1, BlurMaskFilter.Blur.NORMAL);
        }
       
        private Paint       mPaint;
        private MaskFilter  mEmboss;
        private MaskFilter  mBlur;
       
        public void colorChanged(int color) {
            mPaint.setColor(color);
        }

        public class MyView extends View {
           
            private static final float MINP = 0.25f;
            private static final float MAXP = 0.75f;
           
            private Bitmap  mBitmap;
            private Canvas  mCanvas;
            private Path    mPath;
            private Paint   mBitmapPaint;
           
            public MyView(Context c) {
                super(c);
               
                mBitmap = Bitmap.createBitmap(480, 320, Bitmap.Config.ARGB_8888);
                mCanvas = new Canvas(mBitmap);
                mPath = new Path();
                mBitmapPaint = new Paint(Paint.DITHER_FLAG);
            }

            @Override
            protected void onSizeChanged(int w, int h, int oldw, int oldh) {
                super.onSizeChanged(w, h, oldw, oldh);
            }
           
            @Override
            protected void onDraw(Canvas canvas) {
             
                canvas.drawColor(0xFFAAAAAA);
                canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
               
                canvas.drawPath(mPath, mPaint);
            }
           
            private float mX, mY;
            private static final float TOUCH_TOLERANCE = 4;
           
            private void touch_start(float x, float y) {
                mPath.reset();
                mPath.addCircle(x,y,50,Direction.CW);
                mX = x;
                mY = y;
            }
            private void touch_move(float x, float y) {
             mPath.addCircle(x,y,50,Direction.CW);
            }
            private void touch_up() {
                mCanvas.drawPath(mPath, mPaint);
                mPath.reset();
            }
           
            @Override
            public boolean onTouchEvent(MotionEvent event) {
                float x = event.getX();
                float y = event.getY();
               
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        touch_start(x, y);
                        invalidate();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        touch_move(x, y);
                        invalidate();
                        break;
                    case MotionEvent.ACTION_UP:
                        touch_up();
                        invalidate();
                        break;
                }
                return true;
            }
        }

    粗细:

     mPaint.setStrokeWidth(20);//画笔的粗细

    硬度:

     mPaint.setMaskFilter(XXX);

    XXX处有两种可以设置:

     mEmboss = new EmbossMaskFilter(new float[] { 0, 1, 1},
                                           0.2f, 6, 3.5f);//指定了光源的方向和环境光强度来添加浮雕效果。三个参数分别是光源的方向(具体的x,y,z代表从哪个方向还未研究 )、环境光的亮度、要应用的反射等级、向mask应用一定级别的模糊

     mBlur = new BlurMaskFilter(1, BlurMaskFilter.Blur.NORMAL);//指定了一个模糊的样式和半径来处理Paint的边缘。第一个参数文档上说是半径,大概就是PS软件中硬度的半径大小吧,其实就是硬度的强度大小,第二个参数有三种NORMAL\INNER\OUT

    Path

    Path路径类在位于android.graphics.Path中,Path的构造方法比较简单。
    Java代码:
    Path cwj=new Path(); //构造方法
    复制代码
                    下面我们画一个封闭的原型路径,我们使用Path类的addCircle方法。
    Java代码:
    cwj.addCircle(10,10,50,Direction.CW);
    //参数一为x轴水平位置,参数二为y轴垂直位置,第三个参数为圆形的半径,最后是绘制的方向,CW为顺时针方向,而CCW是逆时针方向。
    复制代码
                     我们如何在onDraw方法中如何绘制路径
    Java代码:
    @Override
    protected void onDraw(Canvas canvas)
    {
    Paint paintPath=new Paint();
    Paint paintText=new Paint();
    paintPath.setColor(Color.Red); //路径的画刷为红色
    paintText.setColor(Color.Blue); //路径上的文字为蓝色
    Path pathCWJ=new Path();
    pathCWJ.addCircle(10,10,50,Direction.CW); // 半径为50px,绘制的方向CW为顺时针
    canvas.drawPath(pathCWJ,paintPath);
    canvas.drawTextOnPath("Android123 - CWJ",pathCWJ,0,15,paintText); //在路径上绘制文字
    }
    void addArc(RectF oval, float startAngle, float sweepAngle) //为路径添加一个多边形
    void addCircle(float x, float y, float radius, Path.Direction dir) //给path添加圆圈
    void addOval(RectF oval, Path.Direction dir) //添加椭圆形
    void addRect(RectF rect, Path.Direction dir) //添加一个区域
    void addRoundRect(RectF rect, float[] radii, Path.Direction dir) //添加一个圆角区域
    boolean isEmpty() //判断路径是否为空
    void transform(Matrix matrix) //应用矩阵变换
    void transform(Matrix matrix, Path dst) //应用矩阵变换并将结果放到新的路径中,即第二个参数。
    复制代码

    旋转

    第一种:

    import java.io.InputStream;
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.os.Bundle;
    import android.view.View;
    /*
    * 旋转图像是通过Matrix类得setRotate方法设置要旋转的角度(正值为顺时针旋转,负值为逆时针旋转),
    * 然后使用canvas.drawBitmap绘制旋转后的图像。利用invalidate方法不短重绘View,不断调用onDraw方法实现图像不停的旋转的动画
    */
    public class Main extends Activity {
    class MyView extends View {
      private Bitmap bitmap1;
      private Bitmap bitmap2;
      private int digree1 = 0;// 扳手图像的当前角度
      private int digree2 = 360;// 小球的当前角度
      public MyView(Context context) {
       super(context);
       setBackgroundColor(Color.WHITE);
       //装载图像资源并获得InputStream对象
       InputStream is = getResources().openRawResource(R.drawable.cross);
       //使用 BitmapFactory.decodeStream方法将InputStream解码成Bitmap对象
       bitmap1 = BitmapFactory.decodeStream(is);
       is = getResources().openRawResource(R.drawable.ball);
       bitmap2 = BitmapFactory.decodeStream(is);
      }
      @Override
      protected void onDraw(Canvas canvas) {
       Matrix matrix = new Matrix();
       // 控制旋转角度在0-360之间
       if (digree1 > 360)
        digree1 = 0;
       if (digree2 < 0)
        digree2 = 360;
       // 设置扳手图像的旋转角度和旋转轴心坐标(后两个参数,注意这个坐标是相对于屏幕的),该轴心也是图像的正中心
       matrix.setRotate(digree1++, 160, 250);
       canvas.setMatrix(matrix);
       //绘制扳手图像
       canvas.drawBitmap(bitmap1, 88, 169, null);
       // 设置小球的旋转角度和旋转轴心坐标
       matrix.setRotate(digree2--, 160, 240);
       canvas.setMatrix(matrix);
       //绘制小球图像
       canvas.drawBitmap(bitmap2, 35, 115, null);
       // 不短重绘View,不断调用onDrow方法
       invalidate();
      }
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(new MyView(this));
    }
    }

    此种的缺点是整个画布都在旋转

    第二种

    import java.io.InputStream;
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.view.View;

    public class PaintActivity extends Activity {
     int index = 0;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(new MyView(this));
     }

     class MyView extends View {
      private Paint paint;
      private Bitmap mBitmap;
      private Bitmap resizedBitmap;
      private Matrix mMatrix = new Matrix();

      public MyView(Context context) {
       super(context);
       paint = new Paint();
       paint.setAntiAlias(true);
       paint.setStyle(Paint.Style.STROKE);
       initialize();
      }

      @Override
      protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       canvas.drawColor(Color.WHITE);
       // canvas.drawBitmap(resizedBitmap, 100, 100, paint);
       canvas.drawBitmap(mBitmap, mMatrix, paint);
      }

      private void initialize() {
       // mBitmap = BitmapFactory.decodeResource(getResources(),
       // R.drawable.icon);
       InputStream is = getResources().openRawResource(R.drawable.cross);
       mBitmap = BitmapFactory.decodeStream(is);
       mMatrix.postRotate(0, 200, 200);// 旋转的角度

    //三个参数分别是旋转的角度,和旋转轴x,y
       mMatrix.postTranslate(100, 100);

    //在两个方向平移x,y长度
       // resizedBitmap = Bitmap.createBitmap(mBitmap, 50,50,
       //
       // mBitmap.getWidth(), mBitmap.getHeight(), mMatrix, true);
      }
     }
    }

    此种的缺点是在canvas.drawBitmap(mBitmap, mMatrix, paint);中没有画图的位置的参数 默认是(0,0),如果想画在其他地方,只能通过mMatrix平移

  • 相关阅读:
    the configured user limit (128) on the number of inotify instances has been reached
    RabbitMQ Docker 单服务器集群
    webapi和GRPC性能对比
    camstart API 服务器负载均衡
    视图查询缺少值
    system.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0) 问题
    WCF 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。
    优化sql用到的方法
    调用C++动态链接库出现错误
    ThoughtWorks.QRCode源码
  • 原文地址:https://www.cnblogs.com/shuiyun/p/2738619.html
Copyright © 2020-2023  润新知