(一)高斯模糊实现毛玻璃效果丶共享元素动画 丶地址选择器

效果图如下:


demo1.gif

Demo1

1.高斯模糊实现毛玻璃效果

/*
 * @param 
 * 根据imagepath获取bitmap
 * 得到本地或者网络上的bitmap url - 网络或者本地图片的绝对路径,比如:
 * <p>
 * A.网络路径: url="http://.png" ;
 * <p>
 * B.本地路径:url="file://.png";
 * <p>
 * C.支持的图片格式 ,png, jpg,bmp,gif等等
 * @return
 */

public static int IO_BUFFER_SIZE = 2 * 1024;

public static Bitmap getBitmapToBlur(String url, int scaleRatio) {

    int blurRadius = 5;//通常设置为8就行。
    if (scaleRatio <= 0) {
        scaleRatio = 10;
    }
    Bitmap originBitmap = null;
    InputStream in = null;
    BufferedOutputStream out = null;
    try {
        in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);
        final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
        out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
        copy(in, out);
        out.flush();
        byte[] data = dataStream.toByteArray();
        originBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);


        Bitmap scaledBitmap = Bitmap.createScaledBitmap(originBitmap,
                originBitmap.getWidth() / scaleRatio,
                originBitmap.getHeight() / scaleRatio,
                false);
        Bitmap blurBitmap = doBlur(scaledBitmap, blurRadius);
        return blurBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}


private static void copy(InputStream in, OutputStream out)
        throws IOException {
    byte[] b = new byte[IO_BUFFER_SIZE];
    int read;
    while ((read = in.read(b)) != -1) {
        out.write(b, 0, read);
    }
}
    //    把本地图片毛玻璃化
    public static Bitmap bitmapToBlur(Bitmap originBitmap, int scaleRatio) {
        //        int scaleRatio = 10;
        // 增大scaleRatio缩放比,使用一样更小的bitmap去虚化可以到更好的得模糊效果,而且有利于占用内存的减小;
        int blurRadius = 5;
        //增大blurRadius,可以得到更高程度的虚化,不过会导致CPU更加intensive


       /* 其中前三个参数很明显,其中宽高我们可以选择为原图尺寸的1/10;
        第四个filter是指缩放的效果,filter为true则会得到一个边缘平滑的bitmap,
        反之,则会得到边缘锯齿、pixelrelated的bitmap。
        这里我们要对缩放的图片进行虚化,所以无所谓边缘效果,filter=false。*/
        if (scaleRatio <= 0) {
            scaleRatio = 10;
        }
        Bitmap scaledBitmap = Bitmap.createScaledBitmap(originBitmap,
                originBitmap.getWidth() / scaleRatio,
                originBitmap.getHeight() / scaleRatio,
                false);
        Bitmap blurBitmap = doBlur(scaledBitmap, blurRadius);
        return blurBitmap;
    }

2.takephoto照片选择器

  /**
     * 上传单张图片
     *
     * @param context
     * @param takePhoto
     * @param type    type=0 不裁剪  1 1:1裁剪 2 4:3裁剪 3 16:9裁剪
     */
    public static void uploadPhoto(Context context, final TakePhoto takePhoto, final int type) {

        final DialogVertical cameraDialog = buildDialogVertical(context, "选择照片", "拍照", "从手机相册选择");


        final File file = new File(FileUtil.IMG_FILE_PATH + "/" + System.currentTimeMillis() + FileUtil.JPG_SUFFIX);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        final Uri imageUri = Uri.fromFile(file);


        configCompress(takePhoto);
        configTakePhotoOption(takePhoto);
        cameraDialog.setOnBtn1Listener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (type!=0) {
                    takePhoto.onPickFromCaptureWithCrop(imageUri, getCropOptions(type));
                } else {
                    takePhoto.onPickFromCapture(imageUri);
                }

                cameraDialog.dismiss();
            }
        });
        cameraDialog.setOnBtn2Listener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (type!=0) {
                    takePhoto.onPickFromGalleryWithCrop(imageUri, getCropOptions(type));
                } else {
                    takePhoto.onPickFromGallery();
                }

                cameraDialog.dismiss();
            }
        });
        cameraDialog.show();
    }

    //裁剪
    private static CropOptions getCropOptions(int type) {
      
        boolean withWonCrop = false;

        CropOptions.Builder builder = new CropOptions.Builder();
        switch (type) {
            case 1:
                builder.setAspectX(1).setAspectY(1);
                break;
            case 2:
                builder.setAspectX(4).setAspectY(3);
                break;
            case 3:
                builder.setAspectX(16).setAspectY(9);
                break;
        }

        builder.setWithOwnCrop(withWonCrop);
        return builder.create();
    }

3.头像放大预览使用共享元素动画

 public class ShareElementManager {


    private final long ANIMATOR_DURATION = 300;

    private long mDuration = ANIMATOR_DURATION;
    private ShareElementBean mInfo;
    private AnimatorListenerAdapter mListener;
    private ViewPropertyAnimator mAnimator;
    private Interpolator mInterpolator;
    private boolean mEnter;
    private Context mContext;
    private View mBgView;

    public ShareElementManager(ShareElementBean info, Context context, View bgView) {
        mInfo = info;
        mContext = context;
        mBgView = bgView;
    }

    /**
     * convert target ImageView info and if enter animation to init
     *
     * @param tarView the second page share view
     * @return Class self
     */
    public ShareElementManager convert(final ImageView tarView) {
        if (mInfo == null) {
            throw new NullPointerException("ShareElementBean must not null");
        }
        tarView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                tarView.getViewTreeObserver().removeOnPreDrawListener(this);
                mInfo.convertTargetInfo(tarView, mContext);
                //init
                if (mEnter) {
                    tarView.setPivotX(mInfo.getPivotX());
                    tarView.setPivotY(mInfo.getPivotY());
                    tarView.setTranslationX(mInfo.getCenterOffsetX());
                    tarView.setTranslationY(mInfo.getCenterOffsetY());
                    tarView.setScaleX(mInfo.getScaleX());
                    tarView.setScaleY(mInfo.getScaleY());
                    mAnimator = tarView.animate();
                    start();
                    startBackgroundAlphaAnimation(mBgView, new ColorDrawable(ContextCompat.getColor(mContext, R.color.white)));
                }
                return true;
            }
        });
        return this;
    }

    public ShareElementManager setDuration(long duration) {
        mDuration = duration;
        return this;
    }

    public ShareElementManager setListener(AnimatorListenerAdapter listener) {
        mListener = listener;
        return this;
    }

    public ShareElementManager setInterpolator(Interpolator interpolator) {
        mInterpolator = interpolator;
        return this;
    }

    private void start() {
        mAnimator.setDuration(mDuration)
                .scaleX(1.0f)
                .scaleY(1.0f)
                .translationX(0)
                .translationY(0);
        if (mListener != null) {
            mAnimator.setListener(mListener);
        }
        if (mInterpolator != null) {
            mAnimator.setInterpolator(mInterpolator);
        }
        mAnimator.start();
    }

    public void startEnterAnimator() {
        mEnter = true;
    }

    public void startExitAnimator() {
        mEnter = false;
        mAnimator.setDuration(mDuration)
                .scaleX(mInfo.getScaleX())
                .scaleY(mInfo.getScaleY())
                .translationX(mInfo.getCenterOffsetX())
                .translationY(mInfo.getCenterOffsetY());
        if (mListener != null) {
            mAnimator.setListener(mListener);
        }
        if (mInterpolator != null) {
            mAnimator.setInterpolator(mInterpolator);
        }
        mAnimator.start();
        startBackgroundAlphaAnimation(mBgView, new ColorDrawable(ContextCompat.getColor(mContext, R.color.white)), 255, 0);
    }

    private void startBackgroundAlphaAnimation(final View bgView, final ColorDrawable colorDrawable, int... value) {
        if (bgView == null)
            return;
        if (value == null || value.length == 0) {
            value = new int[]{0, 255};
        }
        ObjectAnimator animator = ObjectAnimator.ofInt(colorDrawable, "alpha", value);
        animator.setDuration(mDuration);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                bgView.setBackground(colorDrawable);
            }
        });
        animator.start();
    }
}

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        mImageView.setTransitionName("image");
    } else {
        ShareElementBean  info= getIntent().getExtras().getParcelable("image");
        mShareElement = new ShareElementManager(info, this, mImageView.getRootView());
        mShareElement.convert(mImageView)
                .setDuration(1000)
                .setInterpolator(new LinearInterpolator())
                .startEnterAnimator();
    }

4.仿淘宝/京东地址选择

   // 设置点击之后的事件
            holder.mTitle.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 点击 分类别
                    switch (tabSelectPosition) {
                        case 0:
                            mSelectProvice = mRvData.get(position);
                            // 清空后面两个的数据
                            mSelectCity = null;
                            mSelectDistrict = null;
                            mSelectCityPosition = 0;
                            mSelectDistrictPosition = 0;
                            mTabLayout.getTabAt(1).setText(defaultCity);
                            if (pickerType==0) {
                                mTabLayout.getTabAt(2).setText(defaultDistrict);
                            }

                            // 设置这个对应的标题
                            mTabLayout.getTabAt(0).setText(mSelectProvice.getN());
                            // 跳到下一个选择
                            mTabLayout.getTabAt(1).select();
                            // 灰掉确定按钮
                            mTvSure.setTextColor(defaultSureUnClickColor);
                            mSelectProvicePosition = position;
                            break;
                        case 1:
                            mSelectCity = mRvData.get(position);
                            // 清空后面一个的数据
                            mSelectDistrict = null;
                            mSelectDistrictPosition = 0;
                            if (pickerType==0) {
                                mTabLayout.getTabAt(2).setText(defaultDistrict);
                            }
                            // 设置这个对应的标题
                            mTabLayout.getTabAt(1).setText(mSelectCity.getN());
                            if (pickerType == 0) {
                                // 跳到下一个选择
                                mTabLayout.getTabAt(2).select();
                                // 灰掉确定按钮
                                mTvSure.setTextColor(defaultSureUnClickColor);
                            } else {
                                mTvSure.setTextColor(defaultSureCanClickColor);
                            }

                            mSelectCityPosition = position;
                            break;
                        case 2:
                            mSelectDistrict = mRvData.get(position);
                            mTabLayout.getTabAt(2).setText(mSelectDistrict.getN());
                            notifyDataSetChanged();
                            // 确定按钮变亮
                            mTvSure.setTextColor(defaultSureCanClickColor);
                            mSelectDistrictPosition = position;
                            break;
                    }
                }
            });

其他文章链接地址:
(二)仿京东顶部伸缩渐变丶自定义viewpager指示器丶viewpager3D回廊丶recyclerview瀑布流
(三)RxJava2常用操作符merge、flatmap、zip--结合MVP架构讲解
(四)仿支付宝首页顶部伸缩滑动/中间层下拉刷新
(五)TabLayout+ViewPager悬浮吸顶及刷新数量动画显示
(六)仿QQ首页drawer/侧滑删除/浮动imgaeView/角标拖拽
(七)仿微信发布朋友圈拖拽删除

将持续更新.. 不喜勿喷,仅个人分享,希望能帮助到你

源码地址:Github传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,259评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,672评论 2 59
  • 最近有点乱,主要是因为心性不定。 一是得知rng夺冠后重燃了电竞之魂,一时有些收不住。二是相亲一事提上日程,前后思...
    奚所以阅读 221评论 0 0
  • 毕业了,近视了,看不清眼前的路了。 难过了,落泪了,不想去上班了。 恐惧了,退缩了,梦想不见了。 当我还是学生时,...
    默默_MMo阅读 251评论 0 0
  • 笑声很大,整个电影厅都是。 画面很美,每帧都想拿起手机拍下来,但眼镜沉迷于里,动作总是太慢。 阿正跟六一是长不大的...
    秦小破po阅读 251评论 0 2