新闻| 文章| 资讯| 行情| 企业| wap手机版| article文章| 首页|会员中心|保存桌面|手机浏览
普通会员

微山市含玉科技有限公司

企业列表
新闻列表
  • 暂无新闻
推荐企业新闻
联系方式
  • 联系人:王女士
首页 > 新闻中心 > Android 涂鸦笔功能 安卓手机涂鸦手机涂鸦「Android 涂鸦笔功能 安卓手机涂鸦」
新闻中心
Android 涂鸦笔功能 安卓手机涂鸦手机涂鸦「Android 涂鸦笔功能 安卓手机涂鸦」
发布时间:2025-02-22        浏览次数:2        返回列表

 

更新:本文的内容只是一部分,这段时间添加了橡皮擦这个新功能,于是问题接二连三的来,比如说:如果用本文的内容去做橡皮擦的话,难!(至少我没解决,不是没背景图,就是有背景图但是更新要在下一下刷橡皮擦的时候才能更新效果),然后有个setbackgroundresource的函数,这个函数就可以了,但是问题又来了,比如说保存,清屏,但是我都解决了(清屏的话就是重新构造一个图,当clear的时候就把这张图赋值给以前的图片。保存的话我就是把绘下个图放到一张有背景的canvas上面,至是分辨率的问题自己去解决就行了,保证存下来的跟你用setbackgoundresource绘图看到的效果一致,需要源码的请联系我)

本人也是在网上查了很多文章后才做出来的,感觉网上的一些涂鸦功能不是很完善,在此就稍微完善了一下。先看下效果图吧(想做成全屏的话需要弄一张跟你屏幕一样大小的背景图,找不到也没关系,我有改尺寸的代码,一并献上)。代码下载请到   其实涂鸦的难点就是如何能在canvas上进行清屏又能保存,至少目前我碰到的情况是这样,这就需要对canvas与bitmap的较为深入的理解了,这个你多写这方面的代码就行了,网上有许多涂鸦的作品,看看源代码。


涂鸦中关于canvas的学习需要掌握三点吧:1:view 2:onDraw函数 3:onTouchEvent

这个view的代码网上有,这里面必须得实现两个重要的方法,一个是onDraw一个是onTouchEvent,onDraw是在你每次触碰屏幕的时候都会触发,包括你初始化的时候。onTouchEvent就是在你触碰屏幕后采取的相应操作。其实涂鸦的关键就是通过drawLine将瞬间变化的两点连起来画成直线,然后画在canvas上的bitmap上。


在mainActivity中我实现了一个菜单按钮

这些就是通过菜单选项对相应的canvas上面的paint进行设置即可达到效果。


那么现在就看看涂鸦这个程序上与canvas相关的几个函数的源码吧!(初始函数,drawLine,drawBitmap这3个)canvas.java文件位于android2.3.3/frameworks/base/graphics/java/android/graphics

canvas(Bitmap bitmap)

这个初始化比较简单,就主要是一个叫做initRaster(bitmap.ni())这个函数


这个需要涉及到向底层本地函数传递一个int参数,那么这个bitmap.ni()是什么呢?查看bitmap.java同样位于android2.3.3/frameworks/base/graphics/java/android/graphics


也就是想下面传递的是mNativeBitmap这个值,而这个值会在FaceDetector_jni.cpp中使用。


那么initRaster怎么实现的呢,看Canvas.cpp位于android/frameworks/base/core/jni/android/graphics,注册函数有

其实这些就是对canva的常见操作,包括下面遇到的drawline,drawBitmap,请看: drawBitmap(Bitmap bitmap,float, left,float top, Paint ,paint)


 drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 

他们实际上都是使用的SkCanvasGlue中的对应函数,而这个时候,canvas已经不再撒过去那个canvas了,它换成了SKCanvas。


比如说drawBitmap,这个是在注册函数中表示的对应的函数

它最终调用的就是SKCanvas中的


类似的,其他的一些canvas的操作都是调用的SKCanvas的对应的方法。(skcanvas与skia的关系请大家网上查询)


那么SKCnvas的源码究竟存放在哪里呢?android/external/skia/src/core,因为所有的方法的实现都是类似的,这里我就单独选择一个简单的drawLine吧

就是将亮点的坐标值存放在一个SKPoint数组中然后作为参数传递给drawPoints函数,继续找drawPoints


首先确保这个数组的非空的存在性,然后用一个迭代器去不断的drawPoint,因为fDevice十一个SKDevice*类型。然后查看DKDevice.cpp文件,同样位于android/external/skia/src/core


调用的是SkDraw中的drawPoints方法


我起初看的时候瞬间想砸电脑,这得耽误我晚上的dota时间啊,但是细看,你会注意到那个case语句,因为我们分析的是drawLine函数,而drawLine函数传入的是kLines_PointMode,那么我们就分析这个语句,其实就这一个for循环


它再一次不甘寂寞地调用了SKpath的两个函数以及自身的drawPath函数


再调用skmatrix,skmask,skscan。。。。图形化的东西了解太少了,鄙人就做抛砖引玉的作用吧,分析到此结束,希望大侠补充了。


最后,在背景图上需要改大小的,这里有代码

这个java工程就是把D盘的t.jpg图片改成300*300的a.jpg图片,这个就得根据你屏幕的大小了。