canvas教程

Android1.5学习笔记–图片移动

字号+ 作者:H5之家 来源:H5之家 2015-10-10 17:13 我要评论( )

如何在android上实现用手指移动图片?其中涉及到图片位置变换的思路,个人总结大致有两种:一、用ImageView包装图片,并放在AbsoluteLayout上,然后通过ImageVie

如何在android上实现用手指移动图片?其中涉及到图片位置变换的思路,个人总结大致有两种:

一、 用ImageView包装图片,并放在AbsoluteLayout上,然后通过ImageView的setLayoutParams方法重设在AbsoluteLayout上的位置来实现图片的移动。

二、 继承layout或者view类,并覆写onDraw方法,从底层对图像进行重绘来实现图片的移动。

个人觉得第二种方法更好,所以就讲讲它的实现吧。关于是继承layout,还是继承view,这个纯粹要看你的软件设计思路。个人认为继承layout的好处就是,你可以在上面继续放置其他layout或者view,而view上就不可以了。既然要实现手指移动,首先要保证组件是可触摸的,且能获取焦点。这两句话少不了:
setFocusable(true);
setFocusableInTouchMode(true);

这里有点误导了,实际上这两条语句的作用仅作为可接受焦点,与触摸移动毫无关系。

当然更少不了onTouchEvent的事件了。下面是一个空函数示例。

public class GuessFunView extends LinearLayout { public GuessFunView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); //do something } public GuessFunView(Context context, AttributeSet attrs) { super(context, attrs); setFocusable(true); setFocusableInTouchMode(true); //do something } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //do something } @Override public boolean onTouchEvent(MotionEvent event) { // float x = event.getX(); // float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //do something break; case MotionEvent.ACTION_MOVE: //do something invalidate(); break; case MotionEvent.ACTION_UP: //do something break; } return true; } }

讲一下实现流程。当GuessFunView被创建后,将首先触发onDraw方法,该方法用来绘制显示的图样。当手指触摸、移动或者离开动作时,将触发onTouchEvent方法。在这个方法里面实现记录和计算坐标,并通过调用invalidate()方法,强制重绘图形(可以这样理解,每调用一次invalidate()方法,相当于重新执行一次onDraw方法)。
关键就是onDraw这个函数。而图像的绘制显示离不开Canvas这个被称为画布的神奇的东东,想在哪里显示,就在哪里画。举个例子:

Paint nPaint=new Paint(); @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(pp, ppX, ppY, nPaint); }

Canvas的方法很多,上面这个例子中的drawBitmap方法是用来绘制bitmap图形的。第一个参数pp指明图片,ppX、ppY指明图片的坐标,nPaint参数可以理解为画笔,指明绘制的风格(比如在画几何图形的时候可以通过这个参数设置颜色,粗细等)。
其中ppX和ppY这两个参数就是实现图片任意移动的关键所在。

具体示例代码可以参考我“猜数字”游戏的源码(有点乱,只能参考)。

有了自定义的layout了,那怎样将它显示在屏幕上呢?来看一下main.xml这个布局文件中的片段:

<net.xsmile.game.GuessFunView android:id=”@+id/gngfun” >

… …

</net.xsmile.game.GuessFunView>

这样定义之后,就可以在Activity中使用setContentView(R.layout.main)来显示了。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Canvas与ValueAnimator

    Canvas与ValueAnimator

    2017-04-28 18:00

  • Android Bitmap和Canvas学习笔记(转)

    Android Bitmap和Canvas学习笔记(转)

    2017-04-28 17:00

  • 21天学习android开发教程之SurfaceView与多线程的混搭

    21天学习android开发教程之SurfaceView与多线程的混搭

    2017-04-27 12:00

  • Android画图学习免费下载

    Android画图学习免费下载

    2017-04-27 11:01

网友点评
i