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 回答