Я делаю простое приложение для рисования на Android. Я использую FingerPaint.java, предоставляемый с примером ApiDemos, в качестве основы, добавляя некоторые функции и избавляясь от других. Он в основном создает холст с растровым изображением, которое можно рисовать сверху.
Я добавил функции «открыть» и «сохранить». Функция «сохранить» сохраняет растровое изображение в файле с помощью функции getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES), а функция «open» запускает startActivityForResult (photoPickerIntent, 1) и загружает выбранное изображение.
Проблема в том, что я не могу нарисовать растровое изображение, которое я открыл вручную. При рисовании пальцем отображается след, но как только палец снят с экрана, след исчезает. Если я сохраню это растровое изображение, оно будет отображаться в галерее без изменений. Но при запуске приложения я могу отлично рисовать на холсте.
Я почти уверен, что это очень простая проблема из-за моего непонимания того, как работают Canvas и Bitmap. В любом случае, вот мой код.
При создании моего пользовательского представления:
public MyView(Context c){
super(c);
mBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}
Переопределение OnDraw:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xFFAAAAAA);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
Моя "открытая" функция:
private void open(){
//checkSD: 1 if read only, 2 if RW
if(checkSD()==1 || checkSD()==2){
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 1);
}
}
И, наконец, мой onActivityResult:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//RequestCode:1 image
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
Uri selectedImage = data.getData();
try{
InputStream fIn = getContentResolver().openInputStream(selectedImage);
mBitmap = BitmapFactory.decodeStream(fIn);
fIn.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
}
Я думаю, что моя ошибка в этом коде, но если кто-то думает, что это может быть так, как я на самом деле рисую, я не модифицировал touch_xxx и onTouchEvent из примера FingerPaint.java, так что вы можете взглянуть на это (или попросите меня опубликовать это здесь, если вы по какой-то причине не видите его).
Спасибо!