android绘图—Paint path 旋转

这一生的挚爱 提交于 2020-03-05 17:11:10

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平移

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!