【问题标题】:Android navigation drawer screenshotAndroid 导航抽屉截图
【发布时间】:2014-06-02 10:12:50
【问题描述】:

我实现了一个由导航抽屉中的项目触发的屏幕截图功能。它工作正常,但我想对我看到的整个页面进行截图没有导航抽屉。

我使用了谷歌教程中建议的布局来实现抽屉导航:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--Main content view-->
    <FrameLayout

            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    <!--Navigation Drawer-->
    <ListView
            android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="@color/sw21Background"/>


</android.support.v4.widget.DrawerLayout>

我的代码从被覆盖的监听器方法开始:

/* The click listner for ListView in the navigation drawer */
private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectItem(position, view); // my code, e.g. takeScreenshot(view);
    }
}

     /**
     * Swap fragments in the main content view
     */
    private void selectItem(int position, View view) {
        Fragment fragment = new Fragment();

        if (position == 0) {
            ...
        } else if (position == 3) {
            //Feedback
            // TODO get proper view of current page not the navigation drawer
            Bitmap bitmap = this.takeScreenShot(view.getRootView());
            Uri uri = saveBitmap(bitmap);
            sendEmail(uri);
        } ...

        //Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, fragment)
                .addToBackStack(null)
                .commit();

        //Highlight the selected item, update the title, and close the drawer
        mDrawerList.setItemChecked(position, true);
        setTitle(navigationItemTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);

    }

当前视图被导航栏部分隐藏,所以下面的代码也对导航栏进行了截图:

private Bitmap takeScreenShot(View view) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
                    view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);

    return bitmap;
}

我尝试使用嵌套在 FrameLayout(内容)中的视图,但它没有覆盖操作栏。

【问题讨论】:

标签: android navigation drawer


【解决方案1】:

我遇到了类似的问题,并像这样修复它:

        View screenshotView = findViewById(R.id.content_frame);
        Bitmap bitmap = this.takeScreenShot(screenshotView);
        Uri uri = saveBitmap(bitmap);
        sendEmail(uri);

R.id.content_frame 是我的大型机,我在其中膨胀所有片段。希望它也对你有用。

【讨论】:

    【解决方案2】:

    在您的takeScreenShot 函数中截屏之前关闭NavigationDrawermDrawerLayout.closeDrawer(Gravity.LEFT);

    private Bitmap takeScreenShot(View view) {
        mDrawerLayout.closeDrawer(Gravity.LEFT); // Close Drawer Here
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
                        view.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);
    
        return bitmap;
    }
    

    【讨论】:

    • 感谢您的快速回复。但是,它不起作用,因为 closeDrawer 在我的重写中的逻辑之后执行: onItemClick(...) 方法完成。
    • @journeycorner 你想在屏幕截图中显示抽屉吗?
    • 不,我想隐藏它。此屏幕截图的目的是发送带有附加屏幕截图的反馈电子邮件 - 例如错误报告。
    【解决方案3】:

    我认为正确的答案是关闭抽屉并为 DrawerClosed 创建一个事件处理程序,然后在 Handler 上拍照。

    像这样:

                        drawer.CloseDrawer((int)GravityFlags.Start);
    
                        //take silent screenshot
                        View rootView = Window.DecorView.FindViewById(Resource.Id.MainContainer);
                        drawer.DrawerClosed += (sender, e) =>
                        {
                            Bitmap tmpPic = ShareHandler.TakeScreenShot(this); //TakeScreenShot(rootView); 
                            Java.IO.File imageSaved = ShareHandler.StoreScreenShot(tmpPic);
                            if (imageSaved != null)
                            {
                                ShareHandler.ShareImage(imageSaved, this,"com.whatsapp", "", "ScreenShot Taken from: " + "Wharever");
                            }
                        };    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多