我刚开始研究android,而且我对这项技术比较陌生。我制作了3个具有拖放功能的水平卷轴,我想将它们拖放到某个区域,同时保持失败和成功掉落的数量。到目前为止,我完成了一切,但代码并没有那么有效,而且我认为这种方法并不是最好的方法。我想知道更有效的方法来解决这个问题。
我的activity_main.xml的一部分
<HorizontalScrollView
android:id="@+id/horizontalScrollView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:onClick="onTouch">
<ImageView
android:id="@+id/b1"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a1"/>
<ImageView
android:id="@+id/b2"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a2"/>
<ImageView
android:id="@+id/b3"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a3"/>
<ImageView
android:id="@+id/b4"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a4"/>
<ImageView
android:id="@+id/b5"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a5"/>
<ImageView
android:id="@+id/b6"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a6"/>
<ImageView
android:id="@+id/b7"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a7"/>
<ImageView
android:id="@+id/b8"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a9"/>
<ImageView
android:id="@+id/b9"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a10"/>
<ImageView
android:id="@+id/b10"
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:layout_margin="20dp"
android:src= "@drawable/a8"/>
</LinearLayout>
</HorizontalScrollView>
和MainActivity.java
public class MainActivity extends Activity {
int id;
ImageView drag;
LinearLayout drop;
TextView text, success, fail;
int total, failure, succ = 0, i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drag = (ImageView) findViewById(id);
drag.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent arg1) {
// TODO Auto-generated method stub
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadow = new View.DragShadowBuilder(drag);
v.startDrag(data, shadow, null, 0);
return false;
}
});
drop = (LinearLayout) findViewById(R.id.bottomlinear);
text = (TextView) findViewById(R.id.Total);
success = (TextView) findViewById(R.id.Success);
fail = (TextView) findViewById(R.id.Fail);
drop.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
// TODO Auto-generated method stub
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DRAG_ENTERED:
break;
case DragEvent.ACTION_DROP:
{
succ = succ + 1;
return (true);
}
case DragEvent.ACTION_DRAG_ENDED:
{
total = total + 1;
int failure = total - succ;
success.setText("Sucessful Drops :" + succ);
text.setText("Total Drops: " + total);
fail.setText("Failed Drops: " + failure);
return (true);
}
default:
break;
}
return true;
}
});
}
}
以上代码仅适用于第一个图像视图,我需要一个支持所有这些代码的解决方案。我尝试使用带有for循环的ImageView数组但只返回最后一个ImageView。我真的很感激这方面的一些帮助。
答案 0 :(得分:2)
为了不完全改变你的实现我将使用方法获得id
的参数imageView
。
void dragAndDropImage(String imageId){
// get int id from String
int id = getResources().getIdentifier(imageId, "id", getPackageName());
//here Your drag and drop functionality code
ImageView drag = (ImageView) findViewById(id);
//... rest of code
}
使用它:
for (int i=1; i<=10; i++){
//loop over every imageView ( from 1 to 10 )
dragAndDropImage("b"+i);
}
几乎没有重构说明:
drop, text, success, fail
个视图应存储在某个类属性中,以避免每次都执行findViewById touchListener
应该是一些活动的子类onDragListener
也应该是一些活动的子类答案 1 :(得分:1)
我认为您应该使用Horizontal
Recyclerview
此链接有助于纵向回收查看Verticle Reclyclerview drag and drop
然后在
中进行一些修改在recylerview中将布局管理器设置为水平
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(mActivity, LinearLayoutManager.HORIZONTAL, false));
带有recylerview的水平列表的LinearLayoutManager.HORIZONTAL
您将获得演示的SimpleItemTouchHelperCallback
课程表格
和修改后的方法getMovementFlags
方法如
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
final int dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
final int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
希望这能帮到你
答案 2 :(得分:1)
我为此使用了一个数组,但主要问题是无论我选择什么,我总是得到最后一个图像视图。使用'final'关键字解决了此问题。
final ImageView drag = (ImageView)findViewById(id);
这导致我获得了关于拖动的不同图像视图。所有回复都表示赞赏。
答案 3 :(得分:1)
在拖动侦听器中,您可以传递传递空值的对象类型。
drag.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent arg1) {
PassObject object=new PassObject();
object.setId("id");
// TODO Auto-generated method stub
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadow = new View.DragShadowBuilder(drag);
v.startDrag(data, shadow, object, 0);
return false;
}
});
在Listener中你正在实施它们,你可以得到它。
drop.setOnDragListener(new View.OnDragListener(){
@Override
public boolean onDrag(View v, DragEvent event) {
// TODO Auto-generated method stub
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DRAG_ENTERED:
break;
case DragEvent.ACTION_DROP:
{
//succ = succ + 1;
return (true);
}
case DragEvent.ACTION_DRAG_ENDED:
{
PassObject passObject = (PassObject) event.getLocalState();
String id=passobject.getID();
return true;
}
default:
break;
}
return true;
}
});
}