Android图像处理技术(实现Android中的PS)(六)

好吧,关于Android中图像处理的最后一个微博,保证是最后一个了,希望泥萌不要骂我。。。

今天想实现的效果是:终极大招:利用BitmapMesh来实现一些特效。 当然,BitmapMesh功能十分强大,打开大家的脑洞,相信大家会设计出更炫丽的特效:

和往常一样,首先,上效果图,卖个萌:

怎么样,普通的一张图按正弦曲线跳起舞来了。。。

然后,开始吧:

首先,自定义View:BitmapMeshView:

{//后面跳舞的那张图片private Bitmap mBitmap;WIDTH = 200;HEIGHT = 200;COUNT = (WIDTH + 1) * (HEIGHT + 1);verts[] = new float[COUNT * 2];[COUNT * 2];k = 0;index=0;(Context context, AttributeSet attrs) {super(context, attrs);initView();}() {//从资源中加载一张图片mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);//得到图片的宽和高float bmWidth = mBitmap.getWidth();float bmHeight = mBitmap.getHeight();//遍历所有节点,记录所有点的坐标:for (int i = 0; i < HEIGHT + 1; i++) {//得到当前节点的Y轴坐标:Y轴坐标就是当当前行中所占的比例,好好想想,,不难float fy = bmHeight * i / HEIGHT;for (int j = 0; j < WIDTH + 1; j++) {//得到当前节点的X轴坐标:X轴坐标就是当当前行中所占的比例,float fx=bmWidth*j/WIDTH;//获得原始坐标,想想就知道了origs[index*2+0]=verts[index*2+0]=fx;//提一下:这里fy+50是让图片往下平移一段距离,让图片在跳舞时不至于跳出屏幕外边去origs[index*2+1]=verts[index*2+1]=fy+50;index++;}}}(Canvas canvas) {//这个双层循环是从上面直接复制过来的,改一下中间的内容就行了for (int i = 0; i < HEIGHT + 1; i++) {for (int j = 0; j < WIDTH + 1; j++) {//我们想实现的效果的本质是:x轴坐标不动,y轴坐标按正弦规律变化,所以我们只需要计算Y轴偏移量//下面这个偏移量看似很复杂,其实很简单:/*** 解释一下offset: 这其实是个标准的正弦表达式: Y=A*sin(w*x+&)+h;* 是不是很熟悉(有两个符号不好打,直接用其他符号代替的,,,总之这不重要)* 我们来对号入座:* A=20* &=k;* h=0;* w=1/WIDTH*2*Math.PI* x=j* 然后想一下w为啥是1/WIDTH*2*Math.PI,这个不难吧*/float offSet=(float)Math.sin((float)j/WIDTH*2*Math.PI+k)*20;//更改Y坐标:在原来的基础上加上一个offSet;verts[(i*(WIDTH+1)+j)*2+1]=origs[(i*(WIDTH+1)+j)*2+1]+offSet;}}//让相位K递增k+=0.2F;//绘图canvas.drawBitmapMesh(mBitmap, WIDTH, HEIGHT, verts, 0, null, 0, null);//再次调用onDraw()方法,更新Y坐标invalidate();}}

花了好长时间注释,应该是讲明白了,不明白的请留言,我会及时回复的。

当然,我们实现的效果知识一个小例子,希望本博客能够抛砖引玉,或者能给你些许启发,相信加上你聪慧的大脑,肯定能编写出更加绚丽的效果。

技术是死的,人是活的。。

好了,终于要结束了,希望能给各位朋友一些启发,那我就非常高兴了。

最后,Demo地址:

挫折其实就是迈向成功所应缴的学费。

Android图像处理技术(实现Android中的PS)(六)

相关文章:

你感兴趣的文章:

标签云: