安卓系统:拖放问题

7

我正在为一门课程编写SMIL合成器,计划让画布支持拖放功能,这样您就可以随意放置图片和文本。我查看了一些示例并自己尝试了一些,但是当我在项目中实现拖放时,它不起作用。以下是主要的相关代码:

public class ComposerActivity extends Activity {
    /** Called when the activity is first created. */

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.composer);

    Button add = (Button)findViewById(R.id.addBtn);
    ...

    add.setOnClickListener(mClick);
    ...
}

OnClickListener mClick = new OnClickListener() {
    @Override
    public void onClick(View v){        
        if(v.getId() == R.id.addBtn)
        {
            FrameLayout fl = (FrameLayout)findViewById(R.id.Canvas); 
            LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
            View itemView = inflater.inflate(R.layout.image_add, null);

            View image = (View)itemView.findViewById(R.id.image);   
            image.setBackgroundResource(R.drawable.icon); 

            fl.addView(itemView, new FrameLayout.LayoutParams(40, 40));  

            image.setOnTouchListener(drag);
        }
        ...

OnTouchListener drag = new OnTouchListener(){
    @Override 
    public boolean onTouch(View v, MotionEvent event){ 
        FrameLayout.LayoutParams par = (LayoutParams) v.getLayoutParams(); 
        switch(v.getId()){//What is being touched 
            case R.id.image:{//Which action is being taken 
                switch(event.getAction()){ 
                    case MotionEvent.ACTION_MOVE:{  
                        par.topMargin = (int)event.getRawY() - (v.getHeight()); 
                        par.leftMargin = (int)event.getRawX() - (v.getWidth()/2); 
                        v.setLayoutParams(par); 
                        break; 
                    }//inner case MOVE 
                    case MotionEvent.ACTION_UP:{ 
                        par.height = 40; 
                        par.width = 40; 
                        par.topMargin = (int)event.getRawY() - (v.getHeight()); 
                        par.leftMargin = (int)event.getRawX() - (v.getWidth()/2); 
                        v.setLayoutParams(par); 
                        break; 
                    }//inner case UP 
                    case MotionEvent.ACTION_DOWN:{ 
                        par.height = 60; 
                        par.width = 60; 
                        v.setLayoutParams(par); 
                        break; 
                    }//inner case UP 
                }//inner switch 
                break; 
            }//case image
        }//switch 
            return true; 
        }//onTouch 
    };//drag
}

这里是composer.xml文件:
...
<FrameLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_below="@+id/TopBar" 
    android:layout_above="@+id/addBtn" 
    android:id="@+id/Canvas"
    android:layout_gravity="top">

</FrameLayout>
...

以及image_add.xml文件:

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

当我在我的作曲家上点击添加按钮时,它成功地将图像添加到画布中,当我触摸图像时,它会按照应有的方式变大,从40x40变为60x60。但是它不会随着我的手指在屏幕上移动,这就是我卡住的地方。
感谢任何意见。
2个回答

14

我研究了Android Launcher的代码,看他们如何实现拖放。我非常喜欢他们的对象模型。他们所做的,也许对你来说是值得考虑的,就是将处理拖放的责任移交给了包含所有可拖动视图的ViewGroup中。触摸事件在那里处理,而不是在你的视图中处理。

两个关键类:

DragLayer - 实现了一个自定义的ViewGroup,用于协调屏幕上视图的移动。Launcher DragLayer是FrameLayout的子类。

DragController - 这个对象是控制器,它完成大部分支持拖放的工作。

他们做的另一件事是,在你放下正在拖动的对象之前,不移动实际的视图。然而在屏幕上,你看到的是从视图构造的位图随着你的手指(或指针)的移动而移动的样子。

我建立了一个简单的例子并写了这篇文章。请参见http://blahti.wordpress.com/2011/01/17/moving-views-part-2/,那里有示例的源代码。


我看了你的博客,虽然做得很好,但似乎有点复杂。你会如何动态地向DragLayer添加ImageViews和TextViews,而不是硬编码它们? - Corry
在另一篇博客文章(第三部分)中,我做了那件事。如果您查看菜单选择代码,您会看到:// Add a new object to the DragLayer ImageView newView = new ImageView (this); newView.setImageResource (R.drawable.hello); DragLayer.LayoutParams lp = new DragLayer.LayoutParams (60, 60, 80, 100); mDragLayer.addView (newView, lp); newView.setOnClickListener(this); newView.setOnLongClickListener(this);有点复杂,是的。我从Android Launcher的代码开始,并将其缩减了一些。我想研究developer.android.com上的新拖放功能,并看看哪个最适合我。 - Bill Lahti
1
谢谢Bill,你的博客帮了我很大的忙! - Corry
@Bill,请帮我解答我在你的博客文章中提出的问题。对我来说非常紧急。 - Chandra Sekhar
1
太棒了!正是我在寻找的。@Bill Lahti,你真是个明星! - Marcos Placona
显示剩余2条评论

1

那正是我所需要的。谢谢。 - Dmytro Boichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接