0

奇妙な問題があります、

私にはアクティビティがあります。このアクティビティ内に、ソーシャルネットワークで共有するためにイメージを作成したいレイアウトがあります。このレイアウトには、さまざまな動的画像とテキストが含まれています。そのため、静止画像として保存してオンデマンドで共有することはできません。ユーザーが共有ボタンをタッチしたときに画像を生成する必要があります。

問題は、共有する前にレイアウトを調整する必要があるということです。

    ImageView profilPic = (ImageView)dashboardView.findViewById(R.id.profilePic); 
    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)profilPic.getLayoutParams();
    params.setMargins(10, 62, 0, 0);
    profilPic.invalidate();
    profilPic.requestLayout();

最初にレイアウトの余白を変更し、次にその画像を作成します

Bitmap bitmap = null;   
        try {
            bitmap = Bitmap.createBitmap(dashboardView.getWidth(),
                    dashboardView.getHeight(), Bitmap.Config.ARGB_4444);
            dashboardView.draw(new Canvas(bitmap));
        } catch (Exception e) {
            // Logger.e(e.toString());
        }

        FileOutputStream fileOutputStream = null;
        File path = Environment
                .getExternalStorageDirectory();
        File file = new File(path, "wayzupDashboard" + ".png");
        try {
            fileOutputStream = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
        bitmap.compress(CompressFormat.PNG, 100, bos);
        try {
            bos.flush();
            bos.close();
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

そして最後に私はそれを共有します。

変更されたlayoutParamsを使用してレイアウトを再描画する前にレイアウトをキャプチャすることを除いて、基本的には機能します。レイアウトが再描画された後、新しいレイアウトパラメータが考慮された場合にのみ、このレイアウトをキャプチャする必要があります。

キャプチャコードを削除すると、うまく機能します。共有ボタンをタッチすると、レイアウトが移動します。しかし、キャプチャコードを配置すると、マージンを変更する前にレイアウトをキャプチャするだけです。

レイアウトをキャプチャする前に、レイアウトが再描画されていることを確認するにはどうすればよいですか?

4

2 に答える 2

0

記録のために、ビューがセットアップされたときにのみレイアウトを正しくキャプチャするには、最初にビューをセットアップしてから、遅延スレッドでレイアウトをキャプチャする必要がありました。これが私が見つけた唯一の方法です。

public void onShareButton() {
        dashboardController.setupViewBeforeSharing();

        new Timer().schedule(new TimerTask() {          
            @Override
            public void run() {
                Bitmap bitmap = null;   
                try {
                    bitmap = Bitmap.createBitmap(dashboardView.getWidth(),
                            dashboardView.getHeight(), Bitmap.Config.ARGB_4444);
                    dashboardView.draw(new Canvas(bitmap));
                } catch (Exception e) {
                    // Logger.e(e.toString());
                }

                FileOutputStream fileOutputStream = null;
                File path = Environment
                        .getExternalStorageDirectory();
                File file = new File(path, "wayzupDashboard" + ".png");
                try {
                    fileOutputStream = new FileOutputStream(file);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
                bitmap.compress(CompressFormat.PNG, 100, bos);
                try {
                    bos.flush();
                    bos.close();
                    fileOutputStream.flush();
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                Intent share = new Intent(Intent.ACTION_SEND);
                share.setType("image/png");
                share.putExtra(Intent.EXTRA_TEXT, R.string.addPassengerButton);
                share.putExtra(Intent.EXTRA_STREAM,
                        Uri.parse("file://" + file.getAbsolutePath()));
                startActivity(Intent.createChooser(share, "Share image"));

                MainActivity.this.runOnUiThread(new Runnable() {
                    public void run() {
                        dashboardController.setupViewAfterSharing();   
                    }
                });

            }
        }, 300);
    }
于 2013-01-10T15:41:00.320 に答える
0

もっと簡単な方法は、ビューでレイアウト パスのリスナーをセットアップするdashboardViewことです。-addOnLayoutChangeListener
を使用してリスナーを設定します。 レイアウト パラメーターを変更する にリスナーを設定し、画像が永続的に保存された後に削除します。 改善が追加されることを願っています。View.addOnLayoutChangeListener()

于 2013-01-10T17:49:53.340 に答える