現在、CustomView を使用してキャンバスに描画しています。キャンバスを (おそらくビットマップとして) FileOutputStream に保存し、同じ機能を持つ別の CustomView に移動する必要があります。
これを実装するために別のメソッドを使用する必要があるかどうかはわかりませんが、何をしていても、startActivity(i) を呼び出すとすぐにクラッシュします。
私の理解では、CustomView は、Path オブジェクトに描画する onTouch() で描画され、次に、キャンバスにパスを描画する onDraw(canvas) を呼び出します。(私が間違っている場合は修正してください)。
このキャンバスにはビットマップ オブジェクトが含まれていますか? それとも、onDraw を呼び出すたびに、onCreate() で作成された別のビットマップに書き込む必要がありますか? それとも、onDraw() を呼び出すたびに新しい一時ビットマップを作成する必要がありますか? これについて非常に多くの異なる Q&A を見てきましたが、まだ理解できていません。
ここに私のMainActivityがあります:
public class MainActivity extends Activity {
Bitmap pic;
CustomView mCustomView;
OnTouchListener touchListener;
Button eraseButton;
String [] files = { "File1.png", "File2.png", "File3.png" };
int color = Color.BLACK;
RelativeLayout layout;
private Paint paint = new Paint();
private Path path = new Path();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = (RelativeLayout) findViewById(R.id.layout);
mCustomView = new CustomView(this);
//layout.buildDrawingCache(); should I use this?
layout.addView(mCustomView);
touchListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event){
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(eventX, eventY);
break;
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
path.lineTo(eventX, eventY);
break;
}
mCustomView.invalidate();
return true;
}
};
mCustomView.setOnTouchListener(touchListener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case R.id.black:
Toast.makeText(this, "You have chosen " + getResources().getString(R.string.black) + ".",
Toast.LENGTH_SHORT).show();
paint.setColor(Color.BLACK);
color = Color.BLACK;
break;
case R.id.red:
Toast.makeText(this, "You have chosen " + getResources().getString(R.string.red) + ".",
Toast.LENGTH_SHORT).show();
paint.setColor(Color.RED);
color = Color.RED;
break;
case R.id.blue:
Toast.makeText(this, "You have chosen " + getResources().getString(R.string.blue) + ".",
Toast.LENGTH_SHORT).show();
paint.setColor(Color.BLUE);
color = Color.BLUE;
break;
case R.id.yellow:
Toast.makeText(this, "You have chosen " + getResources().getString(R.string.yellow) + ".",
Toast.LENGTH_SHORT).show();
paint.setColor(Color.YELLOW);
color = Color.YELLOW;
break;
case R.id.erase:
Toast.makeText(this, "You have chosen to clear the screen. The current pen is now Black.", Toast.LENGTH_SHORT).show();
paint.setColor(Color.BLACK);
color = Color.BLACK;
path.reset();
mCustomView.invalidate();
item.setChecked(false);
break;
case R.id.next:
nextScreen(); //saves the bitmap, and call startActivity(), crashing now
return true;
default:
return super.onOptionsItemSelected(item);
}
item.setChecked(true);
return true;
}
public void nextScreen(){
try {
FileOutputStream out = openFileOutput(files[0], Context.MODE_PRIVATE);
pic.compress(Bitmap.CompressFormat.PNG, 100, out);
out.close();
} catch (Exception e){
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
Intent i = new Intent(this.getApplicationContext(), SecondActivity.class);
i.putExtra("filename.png", files);
startActivity(i);
}
public class CustomView extends View {
public CustomView(Context context) {
super(context);
paint.setAntiAlias(true);
paint.setColor(color);
paint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
if (pic == null){
pic = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888); //is this correct?
}
canvas.drawPath(path, paint);
canvas.drawBitmap(pic, 0, 0, paint); //is this correct?
}
}
}