找回密码
 注册
搜索
查看: 2128|回复: 28

[讨论] 【请教】:图片跟随Pen如何实现

[复制链接]
发表于 2009-9-23 16:39:45 | 显示全部楼层 |阅读模式
如题当触摸笔移动时,图片跟着移动
在move事件中处理,代码如下
void mmi_test_pen_move_hdlr(mmi_pen_point_struct point)
{
       if(isImgPress==MMI_TRUE)
       {
         S16 offsetX=point.x-penDownPos.x;
         S16 offsetY=point.y-penDownPos.y;

         gui_lock_double_buffer();
     
         gdi_image_draw_id(imgOriginalPos.x+offsetX,imgOriginalPos.y+offsetY, IMG_TEST_RED_FLOWER);  
          gui_unlock_double_buffer();
         gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_height-1);
       }
}
无论在单一层,还是多层上画
都出现图中的情况,[em10][em10]

请问怎样才不会有拖拽的轨迹,TKS……
<img src="attachments/dvbbs/2009-9/200992316371073499.jpg" border="0" onclick="zoom(this)" onload="if(this.width>document.body.clientWidth*0.5) {this.resized=true;this.width=document.body.clientWidth*0.5;this.style.cursor='pointer';} else {this.onclick=null}" alt="" />
发表于 2009-9-23 17:32:32 | 显示全部楼层
不用gui_lock_double_buffer();试试看[em01]
点评回复

使用道具 举报

发表于 2009-9-23 18:10:48 | 显示全部楼层
在刷当前移动的图片时,把上次刷图的地方请掉。 gdi_draw_solid_rect(imgOriginalPos.x,imgOriginalPos.y,imgOriginalPos.x + picture.width,imgOriginalPos.y+picture.height,GDI_COLOR_TRANSPARENT);
点评回复

使用道具 举报

 楼主| 发表于 2009-9-23 18:17:07 | 显示全部楼层
去掉也不行啊.
还发现一个问题,就是图片滞后于鼠标,不是粘在鼠标上?
是不是算法不对,大家都是怎末实现的?
还请给个建议!
点评回复

使用道具 举报

发表于 2009-9-24 07:41:22 | 显示全部楼层
哈哈,你帅呆了!
点评回复

使用道具 举报

发表于 2009-9-24 07:43:47 | 显示全部楼层
见过别人实现的矩阵菜单光滑滑动的效果吗?你所说的拖影,人家肯定碰到过!
点评回复

使用道具 举报

发表于 2009-9-24 09:05:13 | 显示全部楼层
3楼正解。
点评回复

使用道具 举报

发表于 2009-9-24 10:43:45 | 显示全部楼层
优化gdi_draw_solid_rect, 减少gui_BLT_double_buffer的入参的区域, 才能同时有效.
点评回复

使用道具 举报

 楼主| 发表于 2009-9-24 11:29:47 | 显示全部楼层
谢谢各位的帮忙!
的确正如3楼说的使用gdi_draw_solid_rect删掉上次绘图
正在优化gdi_draw_solid_rect,大体想法是:
记忆每次move时触点的坐标,一旦move触发就与上次求差,以得到偏移量
已有初步效果。move定时器周期是80ms,就是说每80ms就调用一次做差、绘图、刷屏
会不会使系统负担太重?

不知digital说的”减少gui_BLT_double_buffer的入参的区域“何解,
要在整个屏上拖动,参数必须全屏吧?
点评回复

使用道具 举报

发表于 2009-9-24 11:32:44 | 显示全部楼层
设置一个剪切区域,

gui_push_clip();//推进层
gui_set_clip();//设置剪切区域
gdi_draw_solid_rect();//覆盖清除区域
gui_show_image();//显示图片
gui_pop_clip();//推出层
点评回复

使用道具 举报

发表于 2009-9-24 11:40:04 | 显示全部楼层
最后和基础层合并,这样不停刷新不会影响系统的反应速度
点评回复

使用道具 举报

发表于 2009-9-24 13:57:59 | 显示全部楼层
最好把画的这块放基础层上,速度会快点
点评回复

使用道具 举报

 楼主| 发表于 2009-9-24 16:21:04 | 显示全部楼层
搞定了,谢谢各位坛友了[em08]
主要是一开始进了误区设置了N次变量想向gdi_draw_solid_rect
传参,想每次MOVE触发只删上一次的图片范围,如下
gdi_draw_solid_rect(imgCurrPOS.x-offsetMoveX,imgCurrPOS.y-offsetMoveY,imgCurrPOS.x-offsetMoveX+imgW,imgCurrPOS.y-offsetMoveY+imgH,GDI_COLOR_TRANSPARENT);
结果不行,后来干脆刷全屏
gdi_draw_solid_rect(0,0,UI_device_width-1,UI_device_height-1,GDI_COLOR_TRANSPARENT);
竟然可以修复了 [em13]
点评回复

使用道具 举报

 楼主| 发表于 2009-9-24 16:23:01 | 显示全部楼层
图片传上来,从topleft拖到图片的位置(没有任何痕迹).
<img src="attachments/dvbbs/2009-9/200992416224073499.jpg" border="0" onclick="zoom(this)" onload="if(this.width>document.body.clientWidth*0.5) {this.resized=true;this.width=document.body.clientWidth*0.5;this.style.cursor='pointer';} else {this.onclick=null}" alt="" />
点评回复

使用道具 举报

 楼主| 发表于 2009-9-24 16:26:44 | 显示全部楼层
代码传上来,以备后人学习,呵呵
[em16][em16]
void mmi_test_pen_move_hdlr(mmi_pen_point_struct point)
{
DrawCate888PenState((S8 *)"Pen Move",point);
if(isImgPress==MMI_TRUE)
{
  S16 offsetMoveX;
  S16 offsetMoveY;

      static mmi_pen_point_struct penMovePOS;  //记录上次检测到move时pen的坐标
  static mmi_pen_point_struct imgCurrPOS;  //记录上次图片的坐标
  
  penMovePOS.x=penDownPos.x;
  penMovePOS.y=penDownPos.y;
  
  imgCurrPOS.x=imgOriginalPos.x;
  imgCurrPOS.y=imgOriginalPos.y;  
  
  offsetMoveX=point.x-penMovePOS.x;   //当前检测到MOVE的坐标与上次检测到MOVE坐标差
  offsetMoveY=point.y-penMovePOS.y;   //即是图片需要的偏移量
  penMovePOS.x=point.x;
  penMovePOS.y=point.y;

  imgCurrPOS.x+=offsetMoveX;
  imgCurrPOS.y+=offsetMoveY;   
     
  gdi_layer_set_active(my_layer);
   gui_push_clip();//推进层
      //gdi_draw_solid_rect(imgCurrPOS.x-offsetMoveX,imgCurrPOS.y-offsetMoveY,imgCurrPOS.x-offsetMoveX+imgW,imgCurrPOS.y-offsetMoveY+imgH,GDI_COLOR_TRANSPARENT);
  gdi_draw_solid_rect(0,0,UI_device_width-1,UI_device_height-1,GDI_COLOR_TRANSPARENT);
   gdi_image_draw_id(imgCurrPOS.x,imgCurrPOS.y, IMG_TEST_RED_FLOWER);
  
    gui_pop_clip();//推出层
gdi_layer_get_base_handle(&base_layer);
gdi_layer_set_active(base_layer);
gdi_layer_set_blt_layer(base_layer,my_layer,NULL,NULL);
     gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_height-1);
//gui_BLT_double_buffer(0,0,UI_device_width-1,50);

}
}
点评回复

使用道具 举报

 楼主| 发表于 2009-9-24 16:35:24 | 显示全部楼层
上面的只可以拖动一次,
正在实现连续拖动效果
而且还有上面提到的图片不粘在鼠标上,反应有些慢
如果拖动十分迅速,UP后图片还在依轨迹动,最终停在UP点[em11][em11]

各位指点一下如何优化啊
一些层函数如gdi_draw_solid_rect 、gui_push_clip()不是很懂,到底干了啥?
点评回复

使用道具 举报

发表于 2009-9-24 16:43:44 | 显示全部楼层
<A href="http://sourceforge.net/project/platformdownload.php?group_id=260385" TARGET=_blank id="ImgSpan" >试试这个! 点我!</A>
点评回复

使用道具 举报

 楼主| 发表于 2009-9-24 19:53:23 | 显示全部楼层
图片粘鼠标问题解决:
关掉Info Monitor会看到鼠标实时跟随的效果,几乎没有延迟,打开时则有明显的延迟!

调试时一直开着Info Monitor,原来是他的原因!!!!
点评回复

使用道具 举报

 楼主| 发表于 2009-9-24 19:55:24 | 显示全部楼层
以下是引用MTKPHONE在2009-9-24 16:43:44的发言:
<A href="http://sourceforge.net/project/platformdownload.php?group_id=260385" TARGET=_blank id="ImgSpan" >试试这个! 点我!</A>


mtkPHONE什么意思,那个链接是个模拟器软件?
点评回复

使用道具 举报

发表于 2009-9-24 22:17:58 | 显示全部楼层
俺地个神啊,这个要研究这么久?[em14]
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2025-1-8 05:51 , Processed in 0.049803 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表