• 仿微信滑动返回


    核心代码:

    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

  • 相关阅读:
    聊聊豆瓣阅读kindle版..顺便悼念一下library.nu…
    PhoneGap+jQm webapp本地化(1)环境搭建以及资源介绍
    尝试分析Q群作为技术群是个不恰当的选择!
    某android平板项目开发笔记计划任务备份
    android 自动化测试的傻瓜实践之旅(UI篇) 小试身手
    latex/Xelatex书籍排版总结顺便附上一本排好的6寸android书…
    某android平板项目开发笔记自定义sharepreference UI
    android ORM框架的性能简单测试(androrm vs ormlite)
    网络管理员必学手册
    PPT插入FLV视频文件的简单方法
  • 原文地址:https://www.cnblogs.com/yangcong/p/5302912.html
Copyright © 2020-2023  润新知