java - 位图没有正确保存只有黑色图像

标签 java android bitmap android-custom-view

我正在尝试将自定义 View 另存为图像,但这并没有发生,当我在 Android 设备库中打开它时,它只会显示黑色图像。自定义 View 是这样的

public class page extends View  
{
    private static final String TAG = "DrawView";

private boolean clearflag = false;
private static final float MINP = 0.25f;
private static final float MAXP = 0.75f;

private Context context;
private Paint mPaint = new Paint();
private int[] pencolor = { Color.BLUE, Color.GREEN, Color.MAGENTA,
          Color.BLACK, Color.CYAN, Color.GRAY, Color.RED, Color.DKGRAY,
          Color.LTGRAY, Color.YELLOW };

private Canvas  mCanvas;
private Path    mPath;

private ArrayList<Path> paths = new ArrayList<Path>();


public void ClearScreen()
{
    clearflag = true;
    invalidate();
}
public void resetPenColor()
{
    Random random = new Random();
    random.setSeed(System.currentTimeMillis());

    int color_index = random.nextInt(pencolor.length);
   //   Toast.makeText(context, "Pen Color "+color_index, Toast.LENGTH_SHORT).show();
    mPaint.setColor(pencolor[color_index]);
}

public void init(Context context) {
    //super(context);
    this.context = context;
    setFocusable(true);
    setFocusableInTouchMode(true);

   //this.setOnTouchListener(this);

    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(Color.BLACK);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(6);
    mCanvas = new Canvas();
    mPath = new Path();
    paths.add(mPath);


}



public page(Context context, AttributeSet attrs)
{
    super(context, attrs);
    init(context);
    this.context = context;
}

public page(Context context, AttributeSet attrs, int defStyle) 
{
    super(context, attrs, defStyle);
    init(context);
    this.context = context;

}
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    protected void onDraw(Canvas canvas) 
    {            

        if(clearflag)
        {
            canvas.drawColor(Color.WHITE);
            clearflag = false;
            paths.clear();
            paths.add(mPath);
            Log.v("Clear Screen", "---");
        }
        else
        {
            for (Path p : paths)
            {
                canvas.drawPath(p, mPaint);  
                Log.v("draw", "---line");
            }
        }
    }

    private float mX, mY;
    private static final float TOUCH_TOLERANCE = 4;

    private void touch_start(float x, float y) 
    {
        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;
        Log.v("Touch", "Start");
    }
    private void touch_move(float x, float y) 
    {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) 
        {
            mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
            mX = x;
            mY = y;
        }
        Log.v("Touch", "Move");
    }
    private void touch_up() 
    {
        mPath.lineTo(mX, mY);
        // commit the path to our offscreen
        mCanvas.drawPath(mPath, mPaint);
        // kill this so we don't double draw            
        mPath = new Path();
        paths.add(mPath);

        Log.v("Touch", "Move");
    }


@Override
public boolean onTouchEvent(MotionEvent event) 
{

     super.onTouchEvent(event);
     float x = event.getX();
      float y = event.getY();

      switch (event.getActionMasked()) 
      {
          case MotionEvent.ACTION_DOWN:
              touch_start(x, y);
              invalidate();
              break;
          case MotionEvent.ACTION_MOVE:
              touch_move(x, y);
              invalidate();
              break;
          case MotionEvent.ACTION_UP:
              touch_up();
              invalidate();
              break;
          case MotionEvent.ACTION_POINTER_DOWN:
              resetPenColor();
            //  Toast.makeText(context, "Multitouch", Toast.LENGTH_SHORT).show();
              invalidate();
              break;
      }
      return true;
}

我保存位图的主要 Activity 是这样的

public class Book extends Activity
{
    private ImageButton refresh;
    private ImageButton save;
    private page pg;

    public void init()
    {
        refresh = (ImageButton) findViewById(R.id.refresh);
        save = (ImageButton) findViewById(R.id.save);
        pg = (page) findViewById(R.id.page);
    }

    public void onCreate(Bundle onsavestate)
    {
        super.onCreate(onsavestate);
        setContentView(R.layout.book);

        init();
        addListeners();

    }



    public void addListeners()
    {
        refresh.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0) 
            {
                // TODO Auto-generated method stub
                pg.ClearScreen();
            }

        });

        save.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v) 
            {
                // TODO Auto-generated method stub  
                saveautograph();
            }

        }); 
    }

    public void saveautograph()
    {
        Bitmap returnedbitmap = Bitmap.createBitmap(pg.getWidth(), pg.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(returnedbitmap);
        pg.draw(canvas);
        /*Drawable bgDrawable = pg.getBackground();
        if(bgDrawable != null)
        {
            bgDrawable.draw(canvas);
        }*/

        OutputStream stream = null;
        try 
        {
            stream = new FileOutputStream(Environment.getExternalStorageDirectory()+"/autograph.jpeg");
        } 
        catch (FileNotFoundException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         try 
         {
            stream.flush();
            stream.close();
        } 
         catch (IOException e) 
         {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if(stream == null) 
        {
            Log.v("Stream", "null");
        }
        if(returnedbitmap == null)
        {
            Log.v("bitmap", "null");
        }
        returnedbitmap.compress(CompressFormat.PNG, 90, stream);
    }



    }

这是xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:id="@+id/buttonlayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@drawable/buttoncontainer"
        android:gravity="bottom|center"
        android:orientation="horizontal" >

        <ImageButton
            android:id="@+id/refresh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="@color/white"
            android:src="@drawable/refresh"
            android:layout_marginLeft="4dp" />

        <ImageButton
            android:id="@+id/save"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="@color/white"
            android:src="@drawable/save"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp" />
    </LinearLayout>


    <com.gsmappstabs.autographplease.page
        android:id="@+id/page"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/buttonlayout" />

</RelativeLayout>

请帮忙

最佳答案

如下更新您的saveautograph 方法:

public void saveautograph()
{
    pg.setDrawingCacheEnabled(true);
    pg.buildDrawingCache();
    Bitmap returnedBitmap = pg.getDrawingCache();
    try {
           FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory()+"/autograph.jpeg");
           returnedBitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
           out.close();
    } catch (Exception e) {
           e.printStackTrace();
    }
    pg.setDrawingCacheEnabled(false);
}

基本上,您可以使用 getDrawingCache 方法将 View 作为位图获取。然后直接将位图保存到文件..

关于java - 位图没有正确保存只有黑色图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19721851/

相关文章:

java - OutputStream.write 仅在 Java 中写入字符串的一部分

java - 使用javafx中的文件对话框保存矩形的背景图像

android - 如果同时使用 iOS,Google Play Services 8.4.0 会破坏适用于 Android 的 Google Cloud Messaging

android - 在 View.getDrawingCache() 中获取空指针异常

java - 是否有明确定义的方法来衡量 XML 文件的大小和/或复杂性?

java - 在 Android 中选中单选按钮时,如何取消选中单选组中的所有单选按钮?

android - 即使尝试了所有方法,我也无法在 Android 中获得字幕效果

Android软键盘弄乱了视口(viewport)高度并且永远不会将其设置回来

c++ - 将 CDC 窗口的内容导出到 EMF 文件

android - 根据图片的大小改变图片的分辨率