如何使用电话和Tinder应用程序中的手势和动画滑动到上一个活动?
答案 0 :(得分:4)
Telegram正在使用它自己创建的片段。他们创建了一个名为ActionBarLayout的类,它基本上是一个FrameLayout,并被添加到主Activity中,而片段只是一个视图类(称为TelegramFragment),它被添加到ActionBarLayout(它们保存在列表中,比正常的片段快得多(功能少一点)。
要制作动画,他们只需为添加的视图添加动画效果。
答案 1 :(得分:2)
在github上有一个很好的库,我给了我的贡献:它通过活动和片段处理这个功能。
答案 2 :(得分:1)
实际上你所要做的就是把这个 OnCreate:
getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);
MIN_DISTANCE = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, this.getResources().getDisplayMetrics());
rootView = (ViewGroup) ((ViewGroup) this .findViewById(android.R.id.content)).getChildAt(0);
rootView.post(new Runnable() { @Override public void run() {
rootWidth = rootView.getWidth();
} });
}
// Custom Variables
ViewGroup rootView ;
int rootWidth;
boolean enableSwipe= false;
boolean lockSwipe = false;
float downX;
float downY;
float MIN_DISTANCE ;
// Detect touch Events
@Override public boolean dispatchTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = event.getRawX();
downY =event.getRawY();
enableSwipe = false;
lockSwipe = false;
//convert activity to transparent
try { java.lang.reflect.Method getActivityOptions = Activity.class.getDeclaredMethod("getActivityOptions"); getActivityOptions.setAccessible(true); Object options = getActivityOptions.invoke(this); Class<?>[] classes = Activity.class.getDeclaredClasses(); Class<?> translucentConversionListenerClazz = null; for (Class clazz : classes) { if (clazz.getSimpleName().contains("TranslucentConversionListener")) { translucentConversionListenerClazz = clazz; } }
java.lang.reflect.Method convertToTranslucent = Activity.class.getDeclaredMethod("convertToTranslucent", translucentConversionListenerClazz, ActivityOptions.class); convertToTranslucent.setAccessible(true); convertToTranslucent.invoke(this, null, options); } catch (Throwable t) {
}
break;
case MotionEvent.ACTION_MOVE:
if (!lockSwipe){
if(enableSwipe){
float translation = event.getRawX() -downX - MIN_DISTANCE;
if (translation >= rootWidth || translation<= 0){
rootView.setTranslationX(0);
}else{
rootView.setTranslationX(translation);
}
}else{
float translation = event.getRawX() -downX;
if(Math.abs(event.getRawY() - downY) >= MIN_DISTANCE){
enableSwipe = false;
lockSwipe = true;
}else{
enableSwipe = event.getRawX() -downX >= MIN_DISTANCE;
}
}
}
break;
case MotionEvent.ACTION_UP:
if(rootView.getTranslationX() > rootWidth / 5){
rootView.animate()
.translationX(rootWidth)
.setListener(
new AnimatorListenerAdapter() {
@Override public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
finish();
overridePendingTransition(0, 0);
} });
}else{
rootView.animate()
.translationX(0)
.setListener(
new AnimatorListenerAdapter() {
@Override public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
// convert activity back to normal
try {
java.lang.reflect.Method method = Activity.class.getDeclaredMethod("convertFromTranslucent");
method.setAccessible(true);
method.invoke(this);
} catch (Throwable t) {
}
} });
enableSwipe =false;
lockSwipe = false;
}
break;
default:
enableSwipe =false;
lockSwipe = false;
break;
}
if (enableSwipe){
// Event will not be passed to next views
return true;
}
else{
// Event will be passed to next views
return super.dispatchTouchEvent(event);
}
}
{