TranslateAnimation移动视图,但没有动画

时间:2015-11-30 20:46:33

标签: android android-layout translate-animation android-windowmanager

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

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

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

这是相关代码:

wow.subdomains.are.cool.foo.com

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

收到MotionEvent.ACTION_UP时,我希望图标能够顺利返回到屏幕的左边缘。

视觉上,当我拖动图标,然后松开手指时,图标保持在同一位置。当我再次触摸它时,图标会在左边缘快速显示,这是" params.x = initialX;"指令。

请帮忙吗? 谢谢 海梅

1 个答案:

答案 0 :(得分:5)

我实现了类似的功能。 我从bubbles for AndroidMagnet获得了一些灵感,但我根据您的要求进行了调整。

//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代码。