Android Activityジャンプは、共有動画を使ってネットワークの画像をロードします.

8591 ワード

textView表示サーバーを使って戻りました.図文の混排を実現し、htmlの中の写真を表示します.クリックして大図を見ることができます.また、ジェスチャーの縮小をサポートします.共有動画を見て、必要な機能点を一覧表示します.
  • .TextViewを使ってhtmlを表示する(Html.from Htmlを使う)
  • 表示htmlの中のピクチャー(ImageGetterを書き換えて、Glideはピクチャーを表示します)
  • クリックして写真を見ることができます.
  • は、ジェスチャーの収縮をサポートしています.
  • トランジットactivityは共有アニメーションを使って、効果は微信友達圏に似ています.
         Intent intent = new Intent(context, PhotoViewActivity.class);
         intent.putExtra(Constants.IMGURL, netUrl);
         //           5.0       
         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    context.startActivity(intent,  ActivityOptions.makeSceneTransitionAnimation(activity,shareView,"shareView").toBundle());
                }else {
                    context.startActivity(intent);
                }
    PhotoView Activity:このactivityはkotlinファイルです.
      url = intent.getStringExtra(Constants.IMGURL)?:""
      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    ViewCompat.setTransitionName(photoView, "shareView")
                }
    
           Glide.with(this)
                        .load(url)
                        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                        .dontAnimate()
                        .into(photoView)
    ここではコードを使ってview効果を共有しますが、問題があります.
    1クリックした写真の位置は中間に表示されませんでしたが、2回目のクリックは中間に表示されました.appプロセスを終了してやり直すことはできません.いくらphotoViewを設定してもだめです.
    2ネットが遅すぎて、瞬間的なブラックスクリーンがあるかもしれません.viewの効果を共有するのは明らかではありません.
    これはクリック前と後の画像ではなく、2回のネット画像をロードしたためかもしれません.なぜ2回目のクリックが正常になったのですか?一回目のクリックでキャッシュした画像です.2回目は既製の画像を使用したので正常です.
    この問題を解決するには、クリックする前に展示したい写真を現地に保存し、直接に現地の写真を表示すればいいです.このようにクリックした後にすぐに写真が表示されます.ネットがないロード過程の体験ももっといいです.
    Glideで表示されている写真ですので、彼自身はキャッシュカードの機能があります.展示する時はそのままキャッシュの画像を使えばいいです.自分でダウンロードした画像をsdカードのコードを書くのを省きました.
    しかし、Glideはキャッシュ画像を取得する方法を提供していないことが分かりました.しかし、暗号化されたキャッシュパスを取得し、自分でフォルダを作って、画像をタイムスタンプによって名前を付けてフォルダの下にコピーします.
      private class GetImageCacheTask extends AsyncTask<String, Void, File> {
            private View shareView;
            private String netUrl;
            public GetImageCacheTask(View shareView,String netUrl) {
                this.shareView = shareView;
                this.netUrl = netUrl;
            }
    
            @Override
            protected File doInBackground(String... params) {
                try {
                    return Glide.with(context)
                            .load(netUrl)
                            .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                            .get();
                } catch (Exception ex) {
                    return null;
                }
            }
    
            @Override
            protected void onPostExecute(File result) {
                if (result == null) {
                    Intent intent = new Intent(context, PhotoViewActivity.class);
                    intent.putExtra(Constants.IMGURL, netUrl);
                    context.startActivity(intent);
                    return;
                }
                // path           
                String path = result.getPath();
                //     copy,          
                File fileDir = new File(context.getExternalCacheDir(), Constants.PHOTO_CACHE);
                if (!fileDir.exists()) {
                    fileDir.mkdirs();
                }
                String newPath =fileDir.getPath()+ "/"+System.currentTimeMillis()+Constants.PHOTO;
                FilesUtil.copyFile(path,newPath);
    
                Intent intent = new Intent(context, PhotoViewActivity.class);
                intent.putExtra(Constants.IMGURL, newPath);
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    context.startActivity(intent,  ActivityOptions.makeSceneTransitionAnimation(activity,shareView,"shareView").toBundle());
                }else {
                    context.startActivity(intent);
                }
    
            }
        }
    
        /**
         * oldPath:        
         * newPath:     copy   
         */
        public static void copyFile(String oldPath, String newPath) {
            try {
                int byteRead;
                File oldFile = new File(oldPath);
                if (oldFile.exists()) {
                    InputStream inStream = new FileInputStream(oldPath);
                    FileOutputStream fs = new FileOutputStream(newPath);
                    byte[] buffer = new byte[1024];
                    while ( (byteRead = inStream.read(buffer)) != -1) {
                        fs.write(buffer, 0, byteRead);
                    }
                    inStream.close();
                }
            }
            catch (Exception e) {
                System.out.println("        ");
                e.printStackTrace();
            }
        }
    Glideを変えてネットのピクチャーをロードして現地のピクチャーをロードするため、しかしピクチャーがまだ中間まで表示されていないことを発見して、しかし毎回ピクチャーの位置をクリックして変化することはできなくて、まさかまだGlideの関係ですか?
     var file = File(url)
            if(file.exists()){
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    ViewCompat.setTransitionName(photoView, "shareView")
                }
                photoView?.setImageBitmap(Bimp.getLoacalBitmap(url))
    photoViewをsetImageBitmapで表示するように変更しました.前の完成後の効果図です.