gpt4 book ai didi

android - TranslateAnimation 移动 View ,但没有动画

转载 作者:太空狗 更新时间:2023-10-29 16:33:31 25 4
gpt4 key购买 nike

我正在开发一个floatie,类似于facebook 中的chatHead 或OneNote 中的floatie。

创建它后,我需要能够通过触摸图标来移动它,但是当我停止拖动并松开手指时,我希望图标返回到屏幕的左边缘。

通过使用 TranslateAnimation 它可以工作,但没有动画。当我再次触摸图标时,图标出现在左边缘。

这是相关代码:

    trackerHead.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;

@Override public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
TranslateAnimation animation = new TranslateAnimation(
TranslateAnimation.ABSOLUTE, params.x,
TranslateAnimation.ABSOLUTE, initialX,
TranslateAnimation.ABSOLUTE, params.y,
TranslateAnimation.ABSOLUTE, params.y);
animation.setDuration(4000);
animation.setRepeatCount(1);
animation.setInterpolator(new AccelerateInterpolator());
trackerHead.startAnimation(animation);
params.x = initialX;
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(trackerHead, params);
return true;
}
return false;
}
});

其中 trackerHead 是通过 WindowManager 添加到屏幕的 ImageView。

当接收到 MotionEvent.ACTION_UP 时,我希望图标平滑地返回到屏幕的左边缘。

从视觉上看,当我拖动图标然后松开手指时,图标会保持在同一位置。当我再次触摸它时,图标快速出现在左边缘,这是“params.x = initialX;”的明显原因。说明。

有什么帮助吗?谢谢海梅

最佳答案

我实现了一个类似的功能。我从 bubbles for Android 中得到了一些启发。和 Magnet , 但我根据您的要求进行了调整。

//your imageView
private ImageView trackerHead;
private boolean isBeingDragged;
private WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
);

//Constructor or entry for your WindowManager service
public void onCreate() {
super.onCreate();

windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
animator = new MoveAnimator();
this.trackerHead.setOnTouchListener(this);
windowManager.addView(trackerHead, params);
}

@Override
public boolean onTouch(View view, MotionEvent event) {
float x = event.getRaw X();
float y = event.getRawY();

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
animator.stop();
isBeingDragged = true;
break;
case MotionEvent.ACTION_UP:
isBeingDragged = false;
stickToLeftWall();
break;
case MotionEvent.ACTION_MOVE:
if (isBeingDragged) {
move(x - lastXPose, y - lastYPose);
}
break;
}

lastXPose = x;
lastYPose = y;

return false;
}

private void stickToLeftWall() {
animator.start(this, 0);
}

MoveAnimator 类可以作为内部类放置。

class MoveAnimator implements Runnable {

private Handler handler = new Handler(Looper.getMainLooper());
private float destinationX;
private float destinationY;
private long startingTime;

private void start(float x, float y) {
this.destinationX = x;
this.destinationY = y;
startingTime = System.currentTimeMillis();
handler.post(this);
}

@Override
public void run() {
if (trackerHead != null && trackerHead.getParent() != null) {
float progress = Math.min(1, (System.currentTimeMillis() - startingTime) / 400f);
float deltaX = (destinationX - mLayoutParams.x) * progress;
float deltaY = (destinationY - mLayoutParams.y) * progress;
move(deltaX, deltaY);
if (progress < 1) {
handler.post(this);
}
}
}

private void stop() {
handler.removeCallbacks(this);
}
}

这里重要的是 stickToLeftWall 函数。它会让您的 ImageView 在 X 轴上始终返回到 0。但是,如果您愿意,您可以获得设备的 screenWidth 并计算您的 ImageView 应该捕捉到的最近的墙。

我建议你看一下提供的 Github 代码。

关于android - TranslateAnimation 移动 View ,但没有动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34007695/

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