android绘图—Paint path 旋转

摘要:
这三个参数是光源的方向(具体的x、y、y),

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

免责声明:文章转载自《android绘图—Paint path 旋转》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇原生js显示和隐藏解决博易博客后台文章管理页面无法显示分页的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转:android中APK开机自动运行

背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为android.intent.action.BOOT_COMPLETED。只要在程序中“捕捉”到这个消息,再启动之即可。记住,Android框架说:Don't call me, I'll call you back。我们要做的是做好接...

AS3.0中Matrix类的学习经验(改变注册点、旋转图像)

1.如何使用Matrix类来改变注册点:     做相册功能时一开始最烦的就是注册点在(0,0)的位置,为了能方便的旋转、缩放操作,需要将注册点移动到中心,参考雪の猫的方法,做了简化: 代码 var ōbj=this.myImageBitmap; //要改变的图片或影片剪辑var matrix:Matrix = obj.transform.matrix;...

使用echarts插件做图表常见的几个问题(五)——图形的两种渲染方式

场景:echarts中图形有两种渲染方式,canvas渲染和svg渲染,分别运用在什么样的场景下 措施:Canvas 更适合绘制图形元素数量非常大(这一般是由数据量大导致)的图表(如热力图、地理坐标系或平行坐标系上的大规模线图或散点图等),也利于实现某些视觉特效;在不少场景中,SVG 具有重要的优势:它的内存占用更低(这对移动端尤其重要)、渲染性能略高、并...

android 检查网络连接状态实现步骤

获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 1)判断是否有网络连接 复制代码 代码如下: public boolean isNetworkConnected...

C# PropertyGrid使用总结

1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过DescriptionAttribute设置描述,Attribute可以加在Class上,也可以加在属性上,属性上的Attribute优先级更高; 2. enum会自动使用列表框表示; 3. 自...

uni-app中使用Echarts绘画图表

enmnm...一般会使用npm下载echarts这个包,但是不知道是我自己的配置问题还是别的原因,一直出不来图线, 于是,把Hello uni-app模板里的那个组件抱过来,然后,成了! 首先, 1、页面引入 <template> <view class="container">...