Android用属性动画拖动view到任意位置

直接上图:


代码:

package me.waye;

import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MoveImgActivity extends Activity {
    ImageView iv;
    private int containerWidth;
    private int containerHeight;
    float lastX, lastY;
    RelativeLayout rl;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_move_img);

        rl = (RelativeLayout) findViewById(R.id.rl);


        iv = (ImageView) findViewById(R.id.iv);
        iv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        lastX = event.getRawX();
                        lastY = event.getRawY();
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        //  不要直接用getX和getY,这两个获取的数据已经是经过处理的,容易出现图片抖动的情况
                        float distanceX = lastX - event.getRawX();
                        float distanceY = lastY - event.getRawY();

                        float nextY = iv.getY() - distanceY;
                        float nextX = iv.getX() - distanceX;

                        // 不能移出屏幕
                        if (nextY < 0) {
                            nextY = 0;
                        } else if (nextY > containerHeight - iv.getHeight()) {
                            nextY = containerHeight - iv.getHeight();
                        }
                        if (nextX < 0)
                            nextX = 0;
                        else if (nextX > containerWidth - iv.getWidth())
                            nextX = containerWidth - iv.getWidth();

                        // 属性动画移动
                        ObjectAnimator y = ObjectAnimator.ofFloat(iv, "y", iv.getY(), nextY);
                        ObjectAnimator x = ObjectAnimator.ofFloat(iv, "x", iv.getX(), nextX);

                        AnimatorSet animatorSet = new AnimatorSet();
                        animatorSet.playTogether(x, y);
                        animatorSet.setDuration(0);
                        animatorSet.start();

                        lastX = event.getRawX();
                        lastY = event.getRawY();
                }
                return false;
            }
        });
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        // 这里来获取容器的宽和高
        if (hasFocus) {
            containerHeight = rl.getHeight();
            containerWidth = rl.getWidth();
        }
    }
}

activity_move_img.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.android.interactivechart.MoveImgActivity">

    <ImageView
        android:id="@+id/iv"
        android:src="@drawable/b1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>


转载于:https://my.oschina.net/javaTechLover/blog/338640

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android的列表中,将图片拖动到网格的任意单元格是一种常见的交互操作。实现这个功能的关键是使用适当的布局和触摸事件处理方法。 首先,我们需要准备一个包含图片列表的RecyclerView和一个网格布局的GridView。RecyclerView用于展示图片列表,GridView用于展示网格布局。在RecyclerView中,每个图片项需要被设置为可拖动的控件。 为了实现拖动操作,我们需要在RecyclerView中注册触摸事件监听器。当手指按下图片项时,我们记录下按下的位置和被拖动的项。在移动过程中,我们通过监听手指的移动来实时更新被拖动项的位置,使其在列表中随着手指的移动而移动。 当手指释放时,我们判断被拖动项是否进入了GridView的某个单元格中。如果进入了,我们将该图片项从RecyclerView中移除,并将其添加到GridView的相应单元格中。如果没有进入任何单元格,我们将该图片项恢复到原来的位置。 在拖动过程中,我们可以通过动态更改GridView的单元格布局来反映被拖动项的位置变化。可以通过改变单元格的背景色、边框等方式给用户一种良好的交互反馈。 总结起来,将图片从Android的列表中拖动到网格的任意单元格中需要准备合适的布局和监听器。通过适当的触摸事件处理,我们可以实现图片项在列表和网格之间的拖动和放置操作。这样的功能可以为用户提供更灵活便捷的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值