我这个处理图片移动是不是有问题

oO桀骜 2012-04-01 03:38:04
我的代码:

private OnTouchListener moveEventListener = new OnTouchListener() {
int lastX, lastY;

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getX() - lastX;
int dy = (int) event.getY() - lastY;

int movex = v.getLeft() + dx;
int movey = v.getTop() + dy;
mapView.panBy(new Point(movex, movey));
v.invalidate();
break;

case MotionEvent.ACTION_UP:
break;
}
return true;
}
};



移动的时候手指移动一点,图片移动会比较多,而且我在按住一个点不动时在屏幕上转圈滑动 图片就不知道移动到什么地方去了,谷歌和百度地图的那种手指点上去后移动图片跟着手指移动的狠好,这个事怎么弄的?我这个应该怎么改呢?我这个里面的问题在哪里?


还有就是很多图片组合起来的一个大图要显示出来,用了缓存,异步线程下载等等,移动时画面闪烁感很强,这个事什么原因?我用的DRAWbiTMAP来显示的图片。应该从那方面入手》?
...全文
149 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oO桀骜 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 13 楼 的回复:
引用 9 楼 的回复:

引用 7 楼 的回复:
引用 4 楼 z550946941 的回复:

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX……
[/Quote]
这个我还没研究过,我是全部刷新的,加了缓存和双缓冲,再画出缓存内的图片效率还可以。
jerrypiaopiao 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 9 楼 的回复:

引用 7 楼 的回复:
引用 4 楼 z550946941 的回复:

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入AC……
[/Quote]
我最近也在研究安卓游戏开发,发现Canvas这个东东可以限制屏幕的刷新区域,如果用这个的话应该可以只刷新自己想要的区域吧
oO桀骜 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:
引用 4 楼 z550946941 的回复:

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在……
[/Quote]

双缓冲在实验,可是没能弄出来,有问题,在实验中,双缓冲可能是解决的一个途径,继续努力中。。。。双缓冲我这样的能解决么?我是得到一组瓦片图片数据,然后用canvas.drawbitmap(bitmap,float x,float y,null)这个函数一个屏幕画出12个图片,得到一个完整的大图,是用循环来操作12个图片的,每次移动后都会这样刷新屏幕,如果用双缓冲,那么内存里的那个图要画好了界面上的这个图才能显示出来啊,这样的话如果网速不行肯定的会出现屏幕空白很长时间爱啊~我的思路对不对呢?
oO桀骜 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:
引用 4 楼 z550946941 的回复:

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在……
[/Quote]
双缓冲在实验,可是没能弄出来,有问题,在实验中,双缓冲可能是解决的一个途径,继续努力中。。。。双缓冲我这样的能解决么?我是得到一组瓦片图片数据,然后用canvas.drawbitmap(bitmap,float x,float y,null)这个函数一个屏幕画出12个图片,得到一个完整的大图,是用循环来操作12个图片的,每次移动后都会这样刷新屏幕,如果用双缓冲,那么内存里的那个图要画好了界面上的这个图才能显示出来啊,这样的话如果网速不行肯定的会出现屏幕空白很长时间爱啊~我的思路对不对呢?
oO桀骜 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:
引用 4 楼 z550946941 的回复:

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在……
[/Quote]
因为使用了缓存,在有缓存的图片区域不会出现完全白屏,我是采用全屏刷新的方式,看起来很闪烁,很不友好,而且眼睛也很累,据你的经验该如何解决?就使用view的话。双缓冲在实验,因为是安卓菜鸟,还没弄出来,所以不知道行不行。。。。
oO桀骜 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 z550946941 的回复:]

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在业没有发生过……
[/Quote]


恩 我想明白了,确实是我这个点的位置有问题,我按你说的思路改了,现在能按手指移动的很准确了,请问我用DRAWBITMAP来画瓦片图片很闪烁是什么原因?我没用surfaceview 就是很简单的直接在canvas'上面画出瓦片地图,能指点下吗?
oO桀骜 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在业没有发生过……
[/Quote]

你说的确实是,可是我按你的思路想了想,我感觉我这样应该没什么问题吧?
mapView.panBy(new Point(movex, movey));
我这句的意思是传递手指移动的x,y方向的偏移量给panby函数 然后按这个偏移量来做一些更新操作,和一次按下得到值有很大关系吗?你能和我解释下吗?我再思考思考,感觉你说的这个可能是问题所在,就是一次没想明白,麻烦你给我解释下?
oO桀骜 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

layout部分改成你自己的图片移动代码就行了啊。。。
[/Quote]

你里面的x,y是什么?
jerrypiaopiao 2012-04-05
  • 打赏
  • 举报
回复
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在业没有发生过变化,自然在
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getX() - lastX;
int dy = (int) event.getY() - lastY;

int movex = v.getLeft() + dx;
int movey = v.getTop() + dy;
mapView.panBy(new Point(movex, movey));
v.invalidate();
break;
这个地方的movex、movey所得到的值就达不到你的要求了
李狗蛋52635 2012-04-05
  • 打赏
  • 举报
回复
layout部分改成你自己的图片移动代码就行了啊。。。
千游 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在业没有发生过变化,自然在
case MotionEvent.ACTI……
[/Quote] 学习下~
jerrypiaopiao 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 4 楼 z550946941 的回复:

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在业没有发生过……



……
[/Quote]
是不是在绘制图片之前对整个屏幕进行了刷新操作,你说的那种闪烁的感觉应该是图片消失之后出现一个完全的白屏或黑屏之后再出现图片,根据我以往的开发可能是这个原因,因为我以前做Launcher开发的时候遇到过类似的问题
追风筝的孩子 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 4 楼 z550946941 的回复:

case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
因为在这个地方,当你执行拖动的时候,ACTION_DOWN只执行了一次,lastX、lastY在获得值之后进入ACTION_MOVE之后就在业没有发生过……



……
[/Quote]没双缓冲。。。
oO桀骜 2012-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

我也做过相似的,发代码给你看下,不知能不能帮上忙
Java code

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
temp[0] = x - v.getLeft();
temp[1] = y - v.get……
[/Quote]
你这个是layout 我这个不适用的。 不过还是谢谢啊
李狗蛋52635 2012-04-01
  • 打赏
  • 举报
回复
我也做过相似的,发代码给你看下,不知能不能帮上忙

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
temp[0] = x - v.getLeft();
temp[1] = y - v.getTop();
break;
case MotionEvent.ACTION_MOVE:
v.layout(x - temp[0], y - temp[1], x + v.getWidth() - temp[0], y - temp[1] + v.getHeight());
v.invalidate();
break;
case MotionEvent.ACTION_UP:
break;
}


temp[0]和temp[1]相当于你的lastX和lastY。

80,493

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧