【问题标题】:Save view like bitmap, I only get black screen像位图一样保存视图,我只得到黑屏
【发布时间】:2013-08-31 14:11:48
【问题描述】:

我有一个绘图应用程序,并且我有保存所绘制图片的方法。但我只得到一个带有保存按钮的黑色位图图片。问题出在哪里 ?

这是我的xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/all"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".Circle" 
   >

<org.vkedco.mobappdev.draw_touch_drive_00001.krouzky
    android:id="@+id/pntr"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:tag="Painter" />



 <TextView
    android:id="@+id/textView3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView3"
    android:layout_below="@+id/button4"
    android:layout_marginTop="50dp"
    android:text="value"
    android:textColor="@color/white" />


<Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/button2"
    android:text="Add" />


<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="Delete" />

  <Button
    android:id="@+id/button6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:text="Save"
    android:layout_marginTop="45dp"
    android:layout_alignLeft="@+id/button3" />


  <Button
    android:id="@+id/button5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="Clear"
    android:layout_marginTop="45dp"
    android:layout_alignRight="@+id/button3" />

 <LinearLayout 
     android:orientation="vertical"
     android:layout_height="match_parent"
      android:id="@+id/linearLayout"
     android:layout_width="match_parent" />

还有我的主要活动:

public class aktivita extends Activity{
Button btn;
public LinearLayout mContent;
krouzky mTicTacToeView = null;
public static String tempDir;
public File mypath;
 public static Bitmap mBitmap;
public static int width;
public static int height;
public static float x;
public static float y;
public static float X;
public static float Y;
public static double vzdalenost;
 public String current = null;
 private String uniqueId;
 public krouzky mSignature;
 public View mView;




public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.zaznam_ran);      
   krouzky.t = 0;






   File directory = new File(Environment.getExternalStorageDirectory() + "/Images");
   if(!directory.exists())

       directory.mkdir();

   uniqueId = getTodaysDate() + "_" + getCurrentTime();
   current = uniqueId + ".png";


   mypath= new File(directory,current);

   mContent = (LinearLayout) findViewById(R.id.linearLayout);

   mSignature = new krouzky(this, null);
   mSignature.setBackgroundColor(Color.TRANSPARENT);
   mContent.addView(mSignature, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

   mView = mContent;





    Display display = getWindowManager().getDefaultDisplay();
     width = (display.getWidth());
     height = (display.getHeight());        
    mTicTacToeView = (krouzky) this.findViewById(R.id.pntr);





     Button btn6 = (Button) findViewById(R.id.button6);

        btn6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                    Log.v("log_tag", "Panel Saved");

                        mView.setDrawingCacheEnabled(true);
                       save(v);





                }


        });

}
     private boolean prepareDirectory()
    {
        try
        {
            if (makedirs())
            {
                return true;
            }
            else 
            {
                return false;
            }
        } 
        catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", 1000).show();
            return false;
        }
    }

    private boolean makedirs()  
    {
        File tempdir = new File(tempDir);
        if (!tempdir.exists())
            tempdir.mkdirs();

        if (tempdir.isDirectory())
        {
            File[] files = tempdir.listFiles();
            for (File file : files)
            {
                if (!file.delete())
                {
                    System.out.println("Failed to delete " + file);
                }
            }
        }
        return (tempdir.isDirectory());
    }   

保存方法

    public  void save(View v)
    {
        Log.v("log_tag", "Width: " + v.getWidth());
        Log.v("log_tag", "Height: " + v.getHeight());
        if(mBitmap == null)
        {
            mBitmap =  Bitmap.createBitmap (width, height, Bitmap.Config.RGB_565);
        }
        Canvas canvas = new Canvas(mBitmap);
        try
        {

            FileOutputStream mFileOutStream = new FileOutputStream(mypath);

            v.draw(canvas);
            mBitmap.compress(Bitmap.CompressFormat.PNG, 90, mFileOutStream);
            mFileOutStream.flush();
            mFileOutStream.close();


        }
        catch(Exception e)
        {
            Log.v("log_tag", e.toString());
        }
    }

我的问题已解决,但我有一个小细节。当我更改我的 xml 时,我的应用程序崩溃了。到这个。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".Circle" >

<org.vkedco.mobappdev.draw_touch_drive_00001.krouzky
    android:id="@+id/pntr"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:tag="Painter" />

<Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/button2"
    android:text="Add" />


<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="Delete" />

  <Button
    android:id="@+id/button6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:text="Save"
    android:layout_marginTop="45dp"
    android:layout_alignLeft="@+id/button3" />


  <Button
    android:id="@+id/button5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="Clear"
    android:layout_marginTop="45dp"
    android:layout_alignRight="@+id/button3" />

<LinearLayout 
     android:orientation="vertical"
     android:layout_height="match_parent"
      android:id="@+id/linearLayout"
     android:layout_width="match_parent" >

</LinearLayout>

<TextView
    android:id="@+id/textView3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/button6"
    android:layout_marginTop="21dp"
    android:text="value"
    android:textColor="@color/blue" />

【问题讨论】:

标签: java android view bitmap makefile


【解决方案1】:

试试这个: - 找到你的父视图

RelativeLayout holder = (RelativeLayout) findViewById(R.id.all);

- 并致电loadBitmapFromView(holder)

public static Bitmap loadBitmapFromView(View v) {
    DisplayMetrics dm = getResources().getDisplayMetrics(); 
    v.measure(MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.EXACTLY),
            MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.EXACTLY));
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
    ((RelativeLayout) v).setGravity(Gravity.CENTER);
    Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
            v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(returnedBitmap);
    v.draw(c);

    return returnedBitmap;
}

【讨论】:

    【解决方案2】:

    实际上,您正在方法save(v) 中传递Button btn6 的视图(v) - 传递mcontentmView 的线性布局对象,那么这将是save(mContent) , 这会解决你的问题

    你也可以试试这个方法-

    在方法中传递您的父布局或视图-

     Bitmap file = save(mcontent);
    
     Bitmap save(View v)
       {
        Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        v.draw(c);
        return b;
       }
    

    【讨论】:

    • 哇,非常感谢。这么小的重要细节。谢谢。
    • 还有,一件小事。谁能说我,为什么我的应用程序失败了。如果我在LinearLayout下的xml文件中移动TextView(用于在TextView中保存带有文本的绘制图像)?
    【解决方案3】:

    您可以使用View.getDrawingCache()

    在此之前您应该致电View.setDrawingCache(true)

    【讨论】:

      【解决方案4】:

      我创建了一个扩展 GroupView 的自定义组件,并使用此方法将此布局保存到位图。

          public Bitmap createBitmap() {
          //Log.d("Pin", "Image W ["+this.getWidth()+"] x H ["+this.getHeight()+"]");
          Bitmap b = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.RGB_565);       
          Canvas c = new Canvas(b);
      
          this.draw(c);
      
          return b;
      }
      

      希望对您有所帮助。如果你想保存你的布局,你应该用你想保存的整个布局来改变它

      【讨论】:

        猜你喜欢
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        • 2011-12-27
        • 1970-01-01
        相关资源
        最近更新 更多