Android 将cardview转换为位图

Android 将cardview转换为位图,android,bitmap,Android,Bitmap,类似的问题已经被问了好几次,但我仍然很难理解图像保存在哪里。我使用的是公认的解决方案 我有一个cardwiew,我想将其转换为图像并共享(这是另一个问题)。 我的观点是: <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" ...... andro

类似的问题已经被问了好几次,但我仍然很难理解图像保存在哪里。我使用的是公认的解决方案

我有一个
cardwiew
,我想将其转换为图像并共享(这是另一个问题)。 我的观点是:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
......
android.support.v7.widget.CardView
        android:id="@+id/cv_abtme"
        android:layout_width="368sp"
        android:layout_height="273dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="101dp"
        android:background="@color/colorPrimaryLight"
        app:cardBackgroundColor="@color/about_instagram_color"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop"
            app:srcCompat="@mipmap/ic_launcher" />
        ....

    </android.support.v7.widget.CardView>
但我不知道它是如何工作的,因为我看不到任何生成的图像,但显然没有错误

因此,问题是:

  • 图像创建的路径是什么
  • 我需要一些权限来保存和访问jpg吗
  • 图像创建的路径是什么

    根据问题中的代码,它不会保存在任何地方。您没有编写任何代码来保存它。您创建了一个
    位图
    对象,就是它


    要将
    位图
    保存为磁盘上的图像文件,请调用
    compress()
    ,指定图像类型和
    文件输出流

    这是我的代码,工作正常。我希望这段代码对您有所帮助

    这里的
    xml
    fiel用于
    cardwiew

    <android.support.v7.widget.CardView 
         xmlns:card_view="http://schemas.android.com/apk/res-auto"
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/card_view"
         android:layout_gravity="center"
         android:layout_width="250dp"
         android:layout_height="250dp"
         card_view:cardCornerRadius="4dp">
    
        <ImageView
            android:src="@drawable/img_"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </android.support.v7.widget.CardView>
    
    从视图中获取位图

     public Bitmap loadBitmapFromView(View v) {
        DisplayMetrics dm = getResources().getDisplayMetrics();
        v.measure(View.MeasureSpec.makeMeasureSpec(dm.widthPixels, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(dm.heightPixels, View.MeasureSpec.EXACTLY));
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
                v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(returnedBitmap);
        v.draw(c);
    
        return returnedBitmap;
    }
    
    cardview jpeg文件保存在外部存储位置,文件名为
    sid.jpg

    MyCompleted
    活动
    课程

    public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        CardView cardView = (CardView) findViewById(R.id.card_view);
        loadView(cardView);
    }
    public void loadView(CardView cardView){
    
        try {
            cardView.setDrawingCacheEnabled(true);
            Bitmap bitmap =  loadBitmapFromView(cardView);
            cardView.setDrawingCacheEnabled(false);
    
            String mPath =
                    Environment.getExternalStorageDirectory().toString() + "/sid.jpg";
    
            File imageFile = new File(mPath);
            FileOutputStream outputStream = new
                    FileOutputStream(imageFile);
            int quality = 100;
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
            outputStream.flush();
            outputStream.close();
    
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
    
    public Bitmap loadBitmapFromView(View v) {
        DisplayMetrics dm = getResources().getDisplayMetrics();
        v.measure(View.MeasureSpec.makeMeasureSpec(dm.widthPixels, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(dm.heightPixels, View.MeasureSpec.EXACTLY));
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
                v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(returnedBitmap);
        v.draw(c);
    
        return returnedBitmap;
    }
    
    }
    
    为保存jpeg文件添加预任务
    清单
    文件

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    您正在传递按钮的视图对象。 您必须将布局膨胀为视图对象,然后将其传递给函数。 这可能对你有帮助。

    啊……我想是的。那么,保存位图的效用是什么呢?它还能看吗?@BaRud:“那么保存位图有什么用呢?”——对不起,我不知道你的意思。“它还可以查看吗?”--嗯,如果这是您的意思,您可以在
    图像视图中显示
    位图。
    Bitmap
    只是位图的内存表示形式,就像
    String
    是文本的内存表示形式一样。以另一种方式,我可以使用easyshare直接共享CardView吗?@BaRud:对不起,我不知道什么是“easyshare”。我的意思是:无论如何,谢谢。接着是这个,但仍然没有文件。知道在哪里搜索文件吗?@BaRud在你的设备外部存储根目录中。啊哈。。。有没有办法把它放在下载DIR,因为我没有任何外部存储。事实上,有文件创建在/Android /数据/MyApp。@巴鲁我刚刚更新了我的代码,请检查它的工作罚款。即使链接是有用的作为参考,请考虑改善你的答案,例如,使用有助于OP的具体示例,或从链接中提取相关内容。
    public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        CardView cardView = (CardView) findViewById(R.id.card_view);
        loadView(cardView);
    }
    public void loadView(CardView cardView){
    
        try {
            cardView.setDrawingCacheEnabled(true);
            Bitmap bitmap =  loadBitmapFromView(cardView);
            cardView.setDrawingCacheEnabled(false);
    
            String mPath =
                    Environment.getExternalStorageDirectory().toString() + "/sid.jpg";
    
            File imageFile = new File(mPath);
            FileOutputStream outputStream = new
                    FileOutputStream(imageFile);
            int quality = 100;
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
            outputStream.flush();
            outputStream.close();
    
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
    
    public Bitmap loadBitmapFromView(View v) {
        DisplayMetrics dm = getResources().getDisplayMetrics();
        v.measure(View.MeasureSpec.makeMeasureSpec(dm.widthPixels, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(dm.heightPixels, View.MeasureSpec.EXACTLY));
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
                v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(returnedBitmap);
        v.draw(c);
    
        return returnedBitmap;
    }
    
    }
    
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>