(一)高斯模糊實(shí)現(xiàn)毛玻璃效果丶共享元素動(dòng)畫 丶地址選擇器

效果圖如下:


demo1.gif

Demo1

1.高斯模糊實(shí)現(xiàn)毛玻璃效果

/*
 * @param 
 * 根據(jù)imagepath獲取bitmap
 * 得到本地或者網(wǎng)絡(luò)上的bitmap url - 網(wǎng)絡(luò)或者本地圖片的絕對(duì)路徑,比如:
 * <p>
 * A.網(wǎng)絡(luò)路徑: 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;//通常設(shè)置為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去虛化可以到更好的得模糊效果磺送,而且有利于占用內(nèi)存的減恤镎邸灌闺;
        int blurRadius = 5;
        //增大blurRadius火诸,可以得到更高程度的虛化平项,不過會(huì)導(dǎo)致CPU更加intensive


       /* 其中前三個(gè)參數(shù)很明顯疟呐,其中寬高我們可以選擇為原圖尺寸的1/10玖翅;
        第四個(gè)filter是指縮放的效果翼馆,filter為true則會(huì)得到一個(gè)邊緣平滑的bitmap割以,
        反之,則會(huì)得到邊緣鋸齒应媚、pixelrelated的bitmap严沥。
        這里我們要對(duì)縮放的圖片進(jìn)行虛化,所以無所謂邊緣效果中姜,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, "選擇照片", "拍照", "從手機(jī)相冊(cè)選擇");


        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.頭像放大預(yù)覽使用共享元素動(dòng)畫

 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.仿淘寶/京東地址選擇

   // 設(shè)置點(diǎn)擊之后的事件
            holder.mTitle.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 點(diǎn)擊 分類別
                    switch (tabSelectPosition) {
                        case 0:
                            mSelectProvice = mRvData.get(position);
                            // 清空后面兩個(gè)的數(shù)據(jù)
                            mSelectCity = null;
                            mSelectDistrict = null;
                            mSelectCityPosition = 0;
                            mSelectDistrictPosition = 0;
                            mTabLayout.getTabAt(1).setText(defaultCity);
                            if (pickerType==0) {
                                mTabLayout.getTabAt(2).setText(defaultDistrict);
                            }

                            // 設(shè)置這個(gè)對(duì)應(yīng)的標(biāo)題
                            mTabLayout.getTabAt(0).setText(mSelectProvice.getN());
                            // 跳到下一個(gè)選擇
                            mTabLayout.getTabAt(1).select();
                            // 灰掉確定按鈕
                            mTvSure.setTextColor(defaultSureUnClickColor);
                            mSelectProvicePosition = position;
                            break;
                        case 1:
                            mSelectCity = mRvData.get(position);
                            // 清空后面一個(gè)的數(shù)據(jù)
                            mSelectDistrict = null;
                            mSelectDistrictPosition = 0;
                            if (pickerType==0) {
                                mTabLayout.getTabAt(2).setText(defaultDistrict);
                            }
                            // 設(shè)置這個(gè)對(duì)應(yīng)的標(biāo)題
                            mTabLayout.getTabAt(1).setText(mSelectCity.getN());
                            if (pickerType == 0) {
                                // 跳到下一個(gè)選擇
                                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--結(jié)合MVP架構(gòu)講解
(四)仿支付寶首頁頂部伸縮滑動(dòng)/中間層下拉刷新
(五)TabLayout+ViewPager懸浮吸頂及刷新數(shù)量動(dòng)畫顯示
(六)仿QQ首頁drawer/側(cè)滑刪除/浮動(dòng)imgaeView/角標(biāo)拖拽
(七)仿微信發(fā)布朋友圈拖拽刪除

將持續(xù)更新.. 不喜勿噴翩瓜,僅個(gè)人分享,希望能幫助到你

源碼地址:Github傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末携龟,一起剝皮案震驚了整個(gè)濱河市奥溺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骨宠,老刑警劉巖浮定,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異层亿,居然都是意外死亡桦卒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門匿又,熙熙樓的掌柜王于貴愁眉苦臉地迎上來方灾,“玉大人,你說我怎么就攤上這事碌更≡3ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵痛单,是天一觀的道長嘿棘。 經(jīng)常有香客問我,道長旭绒,這世上最難降的妖魔是什么鸟妙? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮挥吵,結(jié)果婚禮上重父,老公的妹妹穿的比我還像新娘。我一直安慰自己忽匈,他們只是感情好房午,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丹允,像睡著了一般郭厌。 火紅的嫁衣襯著肌膚如雪袋倔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天沪曙,我揣著相機(jī)與錄音奕污,去河邊找鬼。 笑死液走,一個(gè)胖子當(dāng)著我的面吹牛碳默,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缘眶,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘱根,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了巷懈?” 一聲冷哼從身側(cè)響起该抒,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顶燕,沒想到半個(gè)月后凑保,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涌攻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年欧引,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恳谎。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芝此,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出因痛,到底是詐尸還是另有隱情婚苹,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布鸵膏,位于F島的核電站膊升,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏较性。R本人自食惡果不足惜用僧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一赞咙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糟港,春花似錦攀操、人聲如沸速和。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辕宏。三九已至砾莱,卻和暖如春瑞筐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腊瑟。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工聚假, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闰非。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓膘格,卻偏偏與公主長得像,于是被迫代替她去往敵國和親河胎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闯袒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料游岳? 從這篇文章中你...
    hw1212閱讀 12,723評(píng)論 2 59
  • 最近有點(diǎn)亂,主要是因?yàn)樾男圆欢ā?一是得知rng奪冠后重燃了電競之魂访锻,一時(shí)有些收不住褪尝。二是相親一事提上日程,前后思...
    奚所以閱讀 226評(píng)論 0 0
  • 畢業(yè)了期犬,近視了河哑,看不清眼前的路了。 難過了龟虎,落淚了璃谨,不想去上班了。 恐懼了,退縮了佳吞,夢(mèng)想不見了拱雏。 當(dāng)我還是學(xué)生時(shí),...
    默默_MMo閱讀 255評(píng)論 0 0
  • 笑聲很大底扳,整個(gè)電影廳都是铸抑。 畫面很美,每幀都想拿起手機(jī)拍下來衷模,但眼鏡沉迷于里鹊汛,動(dòng)作總是太慢。 阿正跟六一是長不大的...
    秦小破po閱讀 259評(píng)論 0 2