Android:拖放问题

前端之家收集整理的这篇文章主要介绍了Android:拖放问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在为一个班级编写一个SMIL作曲家,我正计划制作画布支持drap和drop,这样你就可以根据需要放置图片文字.我已经查看了示例并自己做了一些,但是当我去实现项目中的拖放时,它不起作用.以下是重要的主要代码
  1. public class ComposerActivity extends Activity {
  2. /** Called when the activity is first created. */
  3.  
  4. @Override
  5. public void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.composer);
  8.  
  9. Button add = (Button)findViewById(R.id.addBtn);
  10. ...
  11.  
  12. add.setOnClickListener(mClick);
  13. ...
  14. }
  15.  
  16. OnClickListener mClick = new OnClickListener() {
  17. @Override
  18. public void onClick(View v){
  19. if(v.getId() == R.id.addBtn)
  20. {
  21. FrameLayout fl = (FrameLayout)findViewById(R.id.Canvas);
  22. LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
  23. View itemView = inflater.inflate(R.layout.image_add,null);
  24.  
  25. View image = (View)itemView.findViewById(R.id.image);
  26. image.setBackgroundResource(R.drawable.icon);
  27.  
  28. fl.addView(itemView,new FrameLayout.LayoutParams(40,40));
  29.  
  30. image.setOnTouchListener(drag);
  31. }
  32. ...
  33.  
  34. OnTouchListener drag = new OnTouchListener(){
  35. @Override
  36. public boolean onTouch(View v,MotionEvent event){
  37. FrameLayout.LayoutParams par = (LayoutParams) v.getLayoutParams();
  38. switch(v.getId()){//What is being touched
  39. case R.id.image:{//Which action is being taken
  40. switch(event.getAction()){
  41. case MotionEvent.ACTION_MOVE:{
  42. par.topMargin = (int)event.getRawY() - (v.getHeight());
  43. par.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
  44. v.setLayoutParams(par);
  45. break;
  46. }//inner case MOVE
  47. case MotionEvent.ACTION_UP:{
  48. par.height = 40;
  49. par.width = 40;
  50. par.topMargin = (int)event.getRawY() - (v.getHeight());
  51. par.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
  52. v.setLayoutParams(par);
  53. break;
  54. }//inner case UP
  55. case MotionEvent.ACTION_DOWN:{
  56. par.height = 60;
  57. par.width = 60;
  58. v.setLayoutParams(par);
  59. break;
  60. }//inner case UP
  61. }//inner switch
  62. break;
  63. }//case image
  64. }//switch
  65. return true;
  66. }//onTouch
  67. };//drag
  68. }

这是composer.xml:

  1. ...
  2. <FrameLayout android:layout_width="fill_parent"
  3. android:layout_height="fill_parent"
  4. android:layout_below="@+id/TopBar"
  5. android:layout_above="@+id/addBtn"
  6. android:id="@+id/Canvas"
  7. android:layout_gravity="top">
  8.  
  9. </FrameLayout>
  10. ...

和image_add.xml:

  1. <View android:id="@+id/image"
  2. android:layout_gravity="top"
  3. xmlns:android="http://schemas.android.com/apk/res/android"/>

当我单击作曲家上的添加按钮时,它成功地将图像添加到画布上,当我触摸图像时,它会响应变大,从40×40到60×60就像它应该的那样.但是我的手指并没跟在屏幕上,而那就是我被卡住的地方.

任何输入都表示赞赏.

解决方法

我研究了Android Launcher代码,看看它们是如何拖放的.我真的很喜欢他们的对象模型.他们做了什么,并且可能对你有好处的考虑,是将处理拖放的责任转移到ViewGroup中,其中所有可拖动的视图都在其中.触摸事件在那里而不是在您的视图中处理.

两个关键类:

DragLayer – 实现一个自定义ViewGroup,它可以协调屏幕上视图的移动. Launcher DragLayer是FrameLayout的子类.

DragController – 该对象是执行大部分工作以支持拖放的控制器.

他们做的另一件事是在你拖动拖动的对象之前不移动实际视图.它看起来并不那样,因为在屏幕上你会看到一个位图,当你的手指(或指针)移动时,视图会随着视图的移动而构建.

我构建了一个简单的例子并编写了它.见http://blahti.wordpress.com/2011/01/17/moving-views-part-2/该示例的源代码也在那里.

猜你在找的Android相关文章