基于Android图标拖动布局的实现

本文详细介绍了如何在Android中实现图标拖动布局。通过重写GridView并结合LongClick和TouchEvent,创建了一个DragGrid控件,实现了长按拖动图标并在释放时自动调整布局的功能。同时讲解了适配器Adapter的使用以及相关事件处理机制。
摘要由CSDN通过智能技术生成


基于Android图标拖动布局的实现

余问鼎 2014-01-10

界面需求:

    界面整齐的排列各个图标,长按其中一个,可拖动选中的图标。拖动到想要的位置之后,界面可将图标再次排列整齐。类似一般android手机桌面布局。

控件介绍:

Android为我们提供了GridView 网格视图GridView 可在控件内添加view子控件,实现view的整齐排列,但是GridView并没有给我们提供拖拽view的功能,因此需要重新编写GridView来实现需要的功能。

  public class DragGrid extends GridView{}

如上述代码,重新定义一个DragGrid控件,继承于GridView

Android事件处理:

   事件我们在与UI交互式发生的,我们点击一个按键时,可能就已经出发好几个事件,例如我们点击数字键“0”,他会涉及到按下事件,和一个弹起(松开)事件,在我们android中还可能涉及到触摸屏事件,所以在android系统中,事件是作为常用的功能之一。而这里我用到的主要有两个:

长按LongClick

触碰事件TouchEvent

适配器Adapter:

适配器(Adapter)是一种界面对象,他用于列表组件和数据来源之间的桥梁。在这里我们用于GridView的数据填充,以及拖动后的布局改变。Android本身提供给我们的配置器不满足我们的需求因此也需要重写一个新的Adapter;

public class DateAdapter extends BaseAdapter {}

主要思路:

    触发GridView的子控件的长按监听,需要重写GridViewLongClick的监听。之后进入图标拖拽功能,此功能需要重写触碰事件TouchEvent。但是仅仅如此,会带来一个问题,在没有长按的时候也会触发触碰事件TouchEvent。因此我们需要一个机制来判断LongClickTouchEvent的先后顺序,在LongClick触发之后才执行TouchEvent。好在android为我们提供了另一个事件——onInterceptTouchEventonInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent重写GridViewonInterceptTouchEvent使得在手指触碰屏幕的时候调用LongClick而不是TouchEvent,就可以避免两者之间的矛盾。之后使用AdapterGridView的内容进行填充,即可完成布局。

具体实现与代码:

   具体实现还需要还需要具体的页面布局。布局文件分为两个,一个是主界面,之间调用重写的GridView即可。另一个是GridViewitem,我们可以用一个ImageView来显示图标,下面用一个TextView来注释名称。

   而将item填充到GridView

以下是一个简单的 Android 示例,演示如何在应用程序中实现图标拖动: 1. 建立一个新的 Android 项目。 2. 在布局文件中添加一个 ImageView 控件,用于显示图标。 ```xml <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" android:layout_marginTop="50dp" android:layout_marginLeft="50dp"/> ``` 3. 在 MainActivity 中设置 ImageView 可以拖动。 ```java public class MainActivity extends AppCompatActivity implements View.OnTouchListener { private ImageView icon; private int xDelta; private int yDelta; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); icon = (ImageView) findViewById(R.id.icon); icon.setOnTouchListener(this); } @Override public boolean onTouch(View view, MotionEvent event) { final int x = (int) event.getRawX(); final int y = (int) event.getRawY(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); xDelta = x - lParams.leftMargin; yDelta = y - lParams.topMargin; break; case MotionEvent.ACTION_MOVE: RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view .getLayoutParams(); layoutParams.leftMargin = x - xDelta; layoutParams.topMargin = y - yDelta; view.setLayoutParams(layoutParams); break; } return true; } } ``` 4. 运行应用程序,并尝试拖动 ImageView。 以上示例演示了如何在 Android 应用程序中实现图标拖动。在实际应用程序中,您可能需要更多的逻辑来处理拖动,如限制拖动范围、拖动时更改图标拖动显示边界等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值