如何在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)来显示了。
发表回复