gpt4 book ai didi

Android:拖放问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:35 26 4
gpt4 key购买 nike

我正在为一个类(class)编写一个 SMIL 作曲器,我正计划让 Canvas 支持拖放,这样您就可以随心所欲地放置图片和文本。我已经查看了示例并自己做了一些,但是当我去实现项目中的拖放时,它不起作用。这是重要的主要代码:

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"/>

当我点击我的 composer 上的添加按钮时,它成功地将图像添加到 Canvas ,当我触摸图像时,它通过变大来响应,从 40x40 到 60x60,就像它应该的那样。但它并没有跟随我的手指穿过屏幕,这就是我卡住的地方。

欢迎任何意见。

最佳答案

我研究了 Android Launcher 代码以了解它们是如何进行拖放操作的。我真的很喜欢他们的对象模型。他们所做的是将处理拖放的责任转移到所有可拖动 View 都在其中的 ViewGroup,这可能对您有好处。触摸事件在那里处理,而不是在您的 View 中处理。

两个关键类:

DragLayer – 实现自定义 ViewGroup,它协调屏幕上 View 的移动。 Launcher DragLayer 是 FrameLayout 的子类。

DragController – 该对象是完成大部分支持拖放工作的 Controller 。

他们做的另一件事是在您放下正在拖动的对象之前不会移动实际 View 。但它看起来并不是那样,因为在屏幕上您会看到一个位图,该位图是根据随着手指(或指针)移动而移动的 View 构建的。

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

关于Android:拖放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5085008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com