Я пытаюсь добиться того, чтобы когда я перестал перетаскивать объект, он должен был прилипнуть к стене экрана.
Я много читал, но не получил желаемого.Я новичок в разработке Android.
Я создаю пакет-бридж для реактивной системы.Мое намерение - создать плавающую шапку чата, например Messenger Facebook .Я создал его успешно, теперь я просто хочу анимировать его, когда я прекращаю перетаскивать элемент.
https://developer.android.com/images/guide/topics/graphics/spring-release.gif
package com.example.recylerview.springanimation;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.support.animation.DynamicAnimation;
import android.support.animation.SpringAnimation;
import android.support.animation.SpringForce;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class FloatingViewService extends Service {
private static final int Value_Of_Drag = 1799;
private WindowManager mWindowManager;
private RelativeLayout mImage;
private SpringAnimation xAnimation;
public View mFloatingView;
private float xDiffInTouchPointAndViewTopLeftCorner = 0f;
private float yDiffInTouchPointAndViewTopLeftCorner = 0f;
public FloatingViewService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mFloatingView =
LayoutInflater.from(this).inflate(R.layout.activity_main, null);
final WindowManager.LayoutParams params = new
WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.START;
params.x = 0;
params.y = 0;
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mFloatingView, params);
xAnimation = new
SpringAnimation(mFloatingView.findViewById(R.id.id),
DynamicAnimation.TRANSLATION_X, 0f);
xAnimation.getSpring().setStiffness(SpringForce.STIFFNESS_LOW);
xAnimation.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY);
mFloatingView.findViewById(R.id.id).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();
xAnimation.cancel();
return true;
case MotionEvent.ACTION_UP:
xAnimation.start();
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
mWindowManager.updateViewLayout(mFloatingView, params);
return true;
}
return false;
}
});
}
}