仿微信滑动返回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仿微信滑动返回相关的知识,希望对你有一定的参考价值。

核心代码:

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v4.widget.SlidingPaneLayout;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

/**
 * @Title: ${file_name}
 * @Description: 带视觉差的滑动返回
 */
public class ParallaxSwipeBackActivity extends  Activity implements SlidingPaneLayout.PanelSlideListener {

    private final static String TAG = ParallaxSwipeBackActivity.class.getSimpleName();
    private final static String WINDOWBITMAP = "screenshots.jpg";
    private File mFileTemp;
    private SlidingPaneLayout slidingPaneLayout;
    private FrameLayout frameLayout;
    private ImageView behindImageView;
    private ImageView shadowImageView;
    private int defaultTranslationX = 100;
    private int shadowWidth = 20;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //通过反射来改变SlidingPanelayout的值
        try {
            slidingPaneLayout = new SlidingPaneLayout(this);
            Field f_overHang = SlidingPaneLayout.class.getDeclaredField("mOverhangSize");
            f_overHang.setAccessible(true);
            f_overHang.set(slidingPaneLayout, 0);
            slidingPaneLayout.setPanelSlideListener(this);
            slidingPaneLayout.setSliderFadeColor(getResources().getColor(android.R.color.transparent));
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onCreate(savedInstanceState);
        mFileTemp = new File(getCacheDir(), WINDOWBITMAP);
        defaultTranslationX = dip2px(defaultTranslationX);
        shadowWidth = dip2px(shadowWidth);
        //behindframeLayout
        FrameLayout behindframeLayout = new FrameLayout(this);
        behindImageView = new ImageView(this);
        behindImageView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
        behindframeLayout.addView(behindImageView, 0);

        //containerLayout
        LinearLayout containerLayout = new LinearLayout(this);
        containerLayout.setOrientation(LinearLayout.HORIZONTAL);
        containerLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));
        containerLayout.setLayoutParams(new ViewGroup.LayoutParams(getWindowManager().getDefaultDisplay().getWidth() + shadowWidth, ViewGroup.LayoutParams.MATCH_PARENT));
        //you view container
        frameLayout = new FrameLayout(this);
        frameLayout.setBackgroundColor(getResources().getColor(android.R.color.white));
        frameLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));

        //add shadow
        shadowImageView = new ImageView(this);
        shadowImageView.setBackgroundResource(R.drawable.shadow);
        shadowImageView.setLayoutParams(new LinearLayout.LayoutParams(shadowWidth, LinearLayout.LayoutParams.MATCH_PARENT));
        containerLayout.addView(shadowImageView);
        containerLayout.addView(frameLayout);
        containerLayout.setTranslationX(-shadowWidth);
        //添加两个view
        slidingPaneLayout.addView(behindframeLayout, 0);
        slidingPaneLayout.addView(containerLayout, 1);
    }

    @Override
    public void setContentView(int id) {
        setContentView(getLayoutInflater().inflate(id, null));
    }

    @Override
    public void setContentView(View v) {
        setContentView(v, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        try {
            behindImageView.setScaleType(ImageView.ScaleType.FIT_XY);
            behindImageView.setImageBitmap(getBitmap());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void setContentView(View v, ViewGroup.LayoutParams params) {
        super.setContentView(slidingPaneLayout, params);
        frameLayout.removeAllViews();
        frameLayout.addView(v, params);
    }


    @Override
    public void onPanelClosed(View view) {

    }

    @Override
    public void onPanelOpened(View view) {
        finish();
        this.overridePendingTransition(0, 0);
    }

    @SuppressLint("NewApi")
    @Override
    public void onPanelSlide(View view, float v) {
        Log.e(TAG, "onPanelSlide :" + v);
        //duang duang duang 你可以在这里加入很多特效
        behindImageView.setTranslationX(v * defaultTranslationX - defaultTranslationX);
        shadowImageView.setAlpha(v<0.8?1:(1.5f-v));
    }

    /**
     * 取得视觉差背景图
     *
     * @return
     */
    public Bitmap getBitmap() {
        return BitmapFactory.decodeFile(mFileTemp.getAbsolutePath());
    }

    /**
     * 启动视觉差返回Activity
     *
     * @param activity
     * @param intent
     */
    public void startParallaxSwipeBackActivty(Activity activity, Intent intent) {
        startParallaxSwipeBackActivty(activity, intent, false);
    }

    /**
     * startParallaxSwipeBackActivty
     *
     * @param activity
     * @param intent
     * @param isFullScreen
     */
    public void startParallaxSwipeBackActivty(Activity activity, Intent intent, boolean isFullScreen) {
        screenshots(activity, isFullScreen);
        startActivity(intent);
        this.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right);
    }

    /**
     * this screeshots form
     *
     * @param activity
     * @param isFullScreen
     */
    public void screenshots(Activity activity, boolean isFullScreen) {
        try {
            //View是你需要截图的View
            View decorView = activity.getWindow().getDecorView();
            decorView.setDrawingCacheEnabled(true);
            decorView.buildDrawingCache();
            Bitmap b1 = decorView.getDrawingCache();
            // 获取状态栏高度 /
            Rect frame = new Rect();
            activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
            int statusBarHeight = frame.top;
            Log.e(TAG, "statusBarHeight:" + statusBarHeight);
            // 获取屏幕长和高 Get screen width and height
            int width = activity.getWindowManager().getDefaultDisplay().getWidth();
            int height = activity.getWindowManager().getDefaultDisplay().getHeight();
            // 去掉标题栏 Remove the statusBar Height
            Bitmap bitmap;
            if (isFullScreen) {
                bitmap = Bitmap.createBitmap(b1, 0, 0, width, height);
            } else {
                bitmap = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);
            }
            decorView.destroyDrawingCache();
            FileOutputStream out = new FileOutputStream(mFileTemp);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据手机的分辨率从 dip 的单位 转成为 px(像素)
     */
    public int dip2px(float dpValue) {
        final float scale = getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}

资源文件:

anim

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:zAdjustment="top">
    <translate
        android:duration="200"
        android:fromXDelta="100.0%p"
        android:toXDelta="0.0" />
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:zAdjustment="top">
    <translate
        android:duration="200"
        android:fromXDelta="0.0"
        android:toXDelta="100.0%p" />
</set>

drawable

技术分享

使用方法很简单,当前类继成ParallaxSwipeBackActivity就好了

源码地址:https://github.com/bushijie/ParallaxSwipeBack

以上是关于仿微信滑动返回的主要内容,如果未能解决你的问题,请参考以下文章

使用SlidingPaneLayout 实现仿微信的滑动返回

高仿微信对话列表滑动删除效果

Android Fragment+NestedRadioGroup仿微信主界面(带底部图标切换页面无滑动)

Android之仿微信Tab滑动

仿微信多页滑动

仿微信滑动退出Activity