android中实现毛笔效果(View 中绘图)

最近有一个项目设计一个APP实现通过触摸屏实现毛笔写字效果。传统的绘画板程序直接通过Path的moveTo和LineTo便可实现简单的线条绘画程序。然而要达到毛笔的笔锋效果则需要更为详细点的设计。我的实现思路是通过以触摸事件DOWN、MOVE、UP中的每一个点为圆心画圆,除此之外还可通过触摸压力的大小改变所绘圆的半径,这样一连串的圆便可粗略地模拟毛笔笔锋效果,在设计次效果时遇到两个问题:

1:android触摸中的MOVE时间取点的频率不是很高,会隔一定的像素取点,当轻触滑动时会出现一天不连续圆的情况,明显不符合笔锋效果。之后我的解决办法是在相邻的圆之间drrawLine,画笔的大小与圆的直径大小差不多,如此便将略显离散的圆连起来形成连续的笔锋效果。

2. 写字板类似的程序说白了就是在画布上绘制多条曲线。我的实现是在继承自View类的OnTouch事件中将屏幕中的点保存到List中(List<List<Object>>).每添加一个点都invalidate重绘画布(onDraw).  在onDraw函数绘制线条的时候遍历List,每一个点画圆,圆之间通过Line连接。 测试时发现当线条过多时程序会出现卡顿现象,自习回顾绘制这一过程会发现是onDraw中频繁绘制影响了程序的效率。 在此情况下通过通过图片缓存技术很好的解决了这个问题,具体实现思路如下:建立一个缓冲画布,和缓冲bitmap,onTouch事件中将圆及Line绘制到缓冲bitmap中。在onDraw函数中直接将缓冲bitmap绘制到canvas中(canvas.drawBitmap(bitmap.paint)).


当然如此设计出来的笔锋效果还很粗糙,后期还可通过每一笔画的起点,转折点及收尾点设计不同的形状来丰富毛笔笔锋的效果


效果图如下

ps:没书法基础,字拙勿喷


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
要在 Android 实现毛笔效果,可以使用 Paint 类的 setMaskFilter 方法。具体实现步骤如下: 1. 创建一个自定义 View,并在 onDraw 方法实现绘图逻辑。 2. 创建一个 Paint 对象,并设置其样式为 STROKE。 3. 使用 setMaskFilter 方法为 Paint 对象设置一个 BlurMaskFilter,可以调整模糊半径大小来控制毛笔效果的强度。 4. 在 onDraw 方法使用 Canvas 对象的 drawPath 方法绘制手指滑动轨迹。 以下是一个简单的实现示例: ```java public class MyView extends View { private Path mPath; private Paint mPaint; public MyView(Context context) { super(context); init(); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { mPath = new Path(); mPaint = new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(10); mPaint.setColor(Color.BLACK); mPaint.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.NORMAL)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(mPath, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mPath.moveTo(x, y); break; case MotionEvent.ACTION_MOVE: mPath.lineTo(x, y); break; case MotionEvent.ACTION_UP: break; } invalidate(); return true; } } ``` 在这个示例,我们创建了一个自定义 View,使用了一个 Path 对象来保存手指滑动的轨迹,使用了一个 Paint 对象来绘制轨迹,并使用了 setMaskFilter 方法为 Paint 对象设置了一个模糊滤镜来实现毛笔效果。在 onTouchEvent 方法,我们根据手指的移动轨迹更新 Path 对象,并调用 invalidate 方法触发 onDraw 方法重新绘制视图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值