Как пройти рисование между действиями - PullRequest
27 голосов
/ 07 декабря 2011

Как я могу передать изображение, нарисованное шрифтом между действиями?

Я пытаюсь это:

private Drawable imagen;

Bundle bundle = new Bundle();
bundle.putSerializable("imagen", (Serializable) unaReceta.getImagen());
Intent myIntent = new Intent(v.getContext(), Receta.class);
myIntent.putExtras(bundle);
startActivityForResult(myIntent, 0);

Но он сообщает мне об исключении:

java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable

Ответы [ 7 ]

50 голосов
/ 07 декабря 2011

1) Передача в качестве дополнений

В Задании A вы декодируете свое изображение и отправляете его через намерение:

  • С помощью этого метода (дополнительно) изображение передается с интервалом 162 миллисекунды
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);     
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
byte[] b = baos.toByteArray();

Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picture", b);
startActivity(intent);

В Деятельность B вы получаете намерение с байтовым массивом (декодированное изображение) ипримените его как источник к ImageView:

Bundle extras = getIntent().getExtras();
byte[] b = extras.getByteArray("picture");

Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
ImageView image = (ImageView) findViewById(R.id.imageView1);

image.setImageBitmap(bmp);

2) Сохранение файла изображения и передача его ссылки в другое действие

"Ограничение размера: сохраняйте его как можно меньшим. Определенно не помещайте туда растровое изображениеесли он не больше пиктограммы (32x32 или чего-либо другого).

  • В * Activity A * сохраните файл (Внутреннее хранилище)
String fileName = "SomeName.png";
try {
    FileOutputStream fileOutStream = openFileOutput(fileName, MODE_PRIVATE);
    fileOutStream.write(b);  //b is byte array 
                             //(used if you have your picture downloaded
                             // from the *Web* or got it from the *devices camera*)
                             //otherwise this technique is useless
    fileOutStream.close();
} catch (IOException ioe) {
    ioe.printStackTrace();
}
  • Передать местоположение в виде строки для действия B
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picname", fileName);
  • In * Activity B * получить файл
Bundle extras = getIntent().getExtras();
String fileName = extras.getString("picname");
  • Сделать * нарисованным * из картинки
File filePath = getFileStreamPath(fileName);
Drawable d = Drawable.createFromPath(filePath.toString());
  • Примените его к ресурсу ImageView
someImageView.setBackgroundDrawable(d);
4 голосов
/ 27 июня 2014

Вы можете пометить каждое изображение (в xml или программно) именем ресурса изображения (например, «img1.png»), а затем получить имя изображения, используя getTag();

Затем используйте getResources().getIdentifier(image name,"drawable", .getPackageName()) чтобы получить идентификатор ресурса для рисования.

И просто передать идентификатор ресурса через намерение -

intent.putExtra("img 1",resource id);

Наконец, результат Activity может создать изображение из ресурса, используя:

getResources().getDrawable(intent.getIntExtra("img 1",-1));    
3 голосов
/ 07 декабря 2011
Объекты

Drawable не являются сериализуемыми по своей природе, поэтому они не могут быть переданы непосредственно в Intent дополнениях.Вы должны найти другой способ сериализации или сохранения данных изображения и извлечения их в новом действии.

Например, если вы работаете с BitmapDrawable экземплярами, базовый Bitmap может быть записан вфайл и чтение обратно, или сериализованный в байтовый массив (если он достаточно мал), и байтовый массив может быть передан через дополнительные функции Intent.

HTH

2 голосов
/ 07 декабря 2011

Намного намного лучше, чтобы не передавать (или сериализовать) Drawables среди Activities.Скорее всего, вы получаете ресурс из ресурса.Следовательно, есть идентификатор ресурса.Передайте это вместо этого, это просто int.И повторно гидратируйте Drawable в другой Activity.

Если Drawable не исходит от ресурса, но он построен во время выполнения в памяти ...давай поговорим об этом.У @Devunwired есть хорошее предложение в этом случае.

0 голосов
/ 10 ноября 2017

Вы можете просто использовать собственный метод buildDrawingCache:

    ImageView imageView = imageLayout.findViewById (R.id.img_thumb);
    imageView.buildDrawingCache ();

    Bundle extras = new Bundle ();
    extras.putParcelable ("image", imageView.getDrawingCache ());

    Intent intent = new Intent (this, ImageActivity.class);
    intent.putExtras (extras);

    startActivity (intent);

, а затем получить его в вашем ImageActivity:

    Bundle bundle = getIntent ().getExtras ();

    if (bundle != null) {

        ImageView imageView = findViewById (R.id.img_full);

        Bitmap image = bundle.getParcelable ("image");
        imageView.setImageBitmap (image);

    }
0 голосов
/ 29 июля 2015

Я не знаю, так ли это, но если причина, по которой вы пытаетесь передать объект рисования, заключается в том, что вы используете Imageview, просто поместите идентификатор ресурса в тег imageview, передайте тег как Integer вместо отрисовки в дополнительном намерении и используйте следующую строку в получающей деятельности: imageView.setImageDrawable (. GetResources () getDrawable (getIntent () getIntExtra ( "image_id", 0)).); * +1001 *

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 07 декабря 2011

Если вы извлекаете эти изображения из Интернета и загружаете их снова и снова, кэширование их будет действительно хорошим вариантом, поскольку вы уменьшите сетевой трафик и увеличите скорость загрузки. Я предлагаю использовать WebImageView из Droid-Fu . Действительно хорошее решение, использовал его в некоторых проектах, и я очень доволен им.

...