Uri from drawable android

Получить URI изображения, хранящегося в drawable

Я добавляю в свое приложение пару примеров, чтобы оно не выглядело таким пустым, когда пользователь смотрит на него в первый раз. В списке с образцами элементов должно быть изображение, а изображение, которое я собираюсь использовать, уже хранится в папке / res / drawable-приложения.

Поскольку у меня уже есть метод, который загружает изображения элементов из URI, я хотел бы получить URI в /res/drawable/myImage.jpg, но, похоже, я не могу понять это правильно.

Последовательность действий следующая: Создайте элемент со строкой, представляющей URI изображения. Отправить список элементов в список Список загружает изображение в фоновой задаче путем преобразования строки в URL и последующего выполнения url.openStream ();

Я безуспешно пробовал несколько вариантов URI. «android.resource: // . » сообщает о неизвестном протоколе «file: //» файл не найден

Так что сейчас я немного не понимаю, как это исправить .

5 ответов

Вы должны использовать ContentResolver для открытия URI ресурсов:

Также вы можете открывать URI файлов и контента, используя этот метод.

В самом простом виде .

Где «книга» — это имя файла в папке с возможностью переноса изображений.

Вы можете использовать Uri.Builder вместо конкатенации строк

Вот что вам действительно нужно:

На основе выше — доработанная версия для любого ресурса:

СПОР

это правильный ответ, однако часть о последних полях неверна — это не имеет ничего общего с ответом — Борис Треухов

@BorisTreukhov — пожалуйста, объясните нам, что вы имеете в виду под «часть о конечных полях не верна» — вопрос — как получить uri в . построить способ его анализа (как анализируется uri? см. ответ)

Источник

ImageView

Общая информация

Компонент ImageView предназначен для отображения изображений. Находится в разделе Widgets.

Для загрузки изображения в XML-файле используется атрибут android:src, в последнее время чаще используется атрибут app:srcCompat.

ImageView является базовым элементом-контейнером для использования графики. Можно загружать изображения из разных источников, например, из ресурсов программы, контент-провайдеров. В классе ImageView существует несколько методов для загрузки изображений:

  • setImageResource(int resId) — загружает изображение по идентификатору ресурса
  • setImageBitmap(Bitmap bitmap) — загружает растровое изображение
  • setImageDrawable(Drawable drawable) — загружает готовое изображение
  • setImageURI(Uri uri) — загружает изображение по его URI

Метод setImageResource()

Сначала нужно получить ссылку на ImageView, а затем используется идентификатор изображения из ресурсов:

Метод setImageBitmap()

Используется класс BitmapFactory для чтения ресурса изображения в объект Bitmap, а затем в ImageView указывается полученный Bitmap. Могут быть и другие варианты.

Метод setImageDrawable()

Если у вас есть готовое изображение, например, на SD-карте, то его можно использовать в качестве объекта Drawable.

Drawable можно получить и из ресурсов, хотя такой код выглядит избыточным, если можно сразу вызвать setImageResource().

Метод setImageURI()

Берётся URI файла изображения и используется в качестве источника изображения. Этот способ годится для работы с локальными изображениями.

Загружаем Drawable через URI.

Другие методы

Также вам часто придется использовать методы, связанные с размерами и масштабированием: setMaxHeight(), setMaxWidth(), getMinimunHeight(), getMinimunWidth(), getScaleType(), setScaleType().

Масштабирование через свойство Scale Type

Для масштабирования картинки в ImageView есть свойство Scale Type и соответствующий ему атрибут android:scaleType и перечисление ImageView.ScaleType.

  • CENTER
  • CENTER_CROP
  • CENTER_INSIDE
  • FIT_CENTER
  • FIT_START
  • FIT_END
  • FIT_XY
  • MATRIX
Читайте также:  Как сделать коллажи андроид

Чтобы увидеть разницу между разными режимами, желательно использовать большую картинку, превосходящую по ширине экрана устройства. Допустим, у нас есть простенькая разметка:

Для наглядности я задал красный цвет для фона ImageView.

Режим android:scaleType=»center» выводит картинку в центре без масштабирования. Если у вас будет картинка большего размера, то края могут быть обрезаны.

Режим android:scaleType=»centerCrop» также размещает картинку в центре, но учитывает ширину или высоту контейнера. Режим попытается сделать так, чтобы ширина (или высота) картинки совпала с шириной (или высотой) контейнера, а остальное обрезается.

Режим android:scaleType=»centerInside» масштабирует картинку, сохраняя пропорции. Можно увидеть задний фон контейнера, если его размеры отличаются от размера картинки.

Режим android:scaleType=»fitCenter» (по умолчанию) похож на предыдущий, но может не сохранять пропорции.

Если выбрать режим android:scaleType=»fitStart», то картинка прижимается к левому верхнему углу и таким образом заполняет верхнюю половину контейнера.

Значение android:scaleType=»fitEnd» сместит картинку в нижнюю часть контейнера.

Режим android:scaleType=»fitXY» растягивает/сжимает картинку, чтобы подогнать её к контейнеру. Может получиться вытянутая картинка, поэтому будьте осторожны.

Последний атрибут android:scaleType=»matrix» вывел картинку без изменений в левом верхнем углу с обрезанными краями.

Атрибут android:adjustViewBounds=»true»

При использовании атрибута scaleType=»fitCenter» из предыдущего примера Android вычисляет размеры самой картинки, игнорируя размеры ImageView. В этом случае ваша разметка может «поехать». Атрибут adjustViewBounds заставляет картинку подчиниться размеру компонента-контейнера. В некоторых случаях это может не сработать, например, если у ImageView установлен атрибут layout_width=»0dip». В таком случае поместите ImageView в RelativeLayout или FrameLayout и используйте значение 0dip для этих контейнеров.

Загрузка изображения из галереи

Предположим, у вас есть на экране компонент ImageView, и вы хотите загрузить в него какое-нибудь изображение из галереи по нажатию кнопки:

Намерение ACTION_PICK вызывает отображение галереи всех изображений, хранящихся на телефоне, позволяя выбрать одно изображение. При этом возвращается адрес URI, определяющий местоположение выбранного изображения. Для его получения используется метод getData(). Далее для преобразования URI-адреса в соответствующий экземпляр класса Bitmap используется специальный метод Media.getBitmap(). И у нас появляется возможность установить изображение в ImageView при помощи setImageBitmap().

На самом деле можно поступить ещё проще и использовать метод setImageURI.

Сравните с предыдущим примером — чувствуете разницу? Тем не менее, приходится часто наблюдать подобный избыточный код во многих проектах. Это связано с тем, что метод порой кэширует адрес и не происходит изменений. Рекомендуется использовать инструкцию setImageURI(null) для сброса кэша и повторный вызов метода с нужным Uri.

В последних версиях системных эмуляторов два примера не работают. Проверяйте на реальных устройствах.

Получить размеры ImageView — будьте осторожны

У элемента ImageView есть два метода getWidth() и getHeight(), позволяющие получить его ширину и высоту. Но если вы попробуете вызвать указанные методы сразу в методе onCreate(), то они возвратят нулевые значения. Можно добавить кнопку и вызвать данные методы через нажатие, тогда будут получены правильные результаты. Либо использовать другой метод активности, который наступает позже.

Копирование изображений между ImageView

Если вам надо скопировать изображение из одного ImageView в другой, то можно получить объект Drawable через метод getDrawable() и присвоить ему второму компоненту.

Примеры

В моих статьях можно найти примеры использования ImageView.

Источник

Uri from drawable android

View s and Drawable for animated GIFs in Android.

Читайте также:  Афонский инстаграм для андроид

Bundled GIFLib via JNI is used to render frames. This way should be more efficient than WebView or Movie classes.

Gradle (Android Studio)

Insert the following dependency to build.gradle file of your project.

Note that Maven central repository should be defined eg. in top-level build.gradle like this:

Gradle, snapshot repository

Current development builds (build from dev branch) are published to OSS snapshot repository. To use them, specify repository URL in repositories block:

See Sample eclipse project with setup instructions.

  • Android 4.2+ (API level 17+)
  • for GifTextureView hardware-accelerated rendering
  • for GifTexImage2D OpenGL ES 2.0+

Building from source

  • Android NDK needed to compile native sources

See sample directory. Sample project is under construction. Not all features are covered yet.

The simplest way is to use GifImageView (or GifImageButton ) like a normal ImageView :

If drawables declared by android:src and/or android:background are GIF files then they will be automatically recognized as GifDrawable s and animated. If given drawable is not a GIF then mentioned Views work like plain ImageView and ImageButton .

GifTextView allows you to use GIFs as compound drawables and background.

GifImageView , GifImageButton and GifTextView have also hooks for setters implemented. So animated GIFs can be set by calling setImageResource(int resId) and setBackgroundResource(int resId)

GifDrawable can be constructed directly from various sources:

InputStreams are closed automatically in finalizer if GifDrawable is no longer needed so you don’t need to explicitly close them. Calling recycle() will also close underlying input source.

Note that all input sources need to have ability to rewind to the beginning. It is required to correctly play animated GIFs (where animation is repeatable) since subsequent frames are decoded on demand from source.

GifDrawable implements an Animatable and MediaPlayerControl so you can use its methods and more:

  • stop() — stops the animation, can be called from any thread
  • start() — starts the animation, can be called from any thread
  • isRunning() — returns whether animation is currently running or not
  • reset() — rewinds the animation, does not restart stopped one
  • setSpeed(float factor) — sets new animation speed factor, eg. passing 2.0f will double the animation speed
  • seekTo(int position) — seeks animation (within current loop) to given position (in milliseconds)
  • getDuration() — returns duration of one loop of the animation
  • getCurrentPosition() — returns elapsed time from the beginning of a current loop of animation

Standard controls for a MediaPlayer (like in VideoView) can be used to control GIF animation and show its current progress.

Just set GifDrawable as MediaPlayer on your MediaController like this:

Retrieving GIF metadata

  • getLoopCount() — returns a loop count as defined in NETSCAPE 2.0 extension
  • getNumberOfFrames() — returns number of frames (at least 1)
  • getComment() — returns comment text ( null if GIF has no comment)
  • getFrameByteCount() — returns minimum number of bytes that can be used to store pixels of the single frame
  • getAllocationByteCount() — returns size (in bytes) of the allocated memory used to store pixels of given GifDrawable
  • getInputSourceByteCount() — returns length (in bytes) of the backing input data
  • toString() — returns human readable information about image size and number of frames (intended for debugging purpose)
Читайте также:  Часы для андроида наручные для детей

Associating single GifDrawable instance with multiple View s

Normally single GifDrawable instance associated with multiple View s will animate only on the last one. To solve that create MultiCallback instance, add View s to it and set callback for given drawable, e.g.:

Note that if you change a drawable of e.g. ImageView , the callback will be removed from the previous drawable. Thereafter, you have to reassign callback or the same GifDrawable instance will stop animating. See #480 for more information.

  • recycle() — provided to speed up freeing memory (like in android.graphics.Bitmap )
  • isRecycled() — checks whether drawable is recycled
  • getError() — returns last error details

Upgrading from 1.2.15

Minimum SDK version changed

Minimum API level is now 17 (Android 4.2). armeabi (arm v5 and v6) is no longer supported.

Upgrading from 1.2.8

Minimum SDK version changed

Minimum API level is now 14 (Android 4.0).

Upgrading from 1.2.3

Meaningful only if consumer proguard rules (bundled with library) are not used (they are used by default by Gradle).

  • Proguard rule has changed to -keep public class pl.droidsonroids.gif.GifIOException

Upgrading from 1.1.17

1.1.17 is the last version supporting API level 8 (Froyo). Starting from 1.2.0 minimum API level is 9 (Gingerbread).

Upgrading from 1.1.13

Handling of several edge cases has been changed:

  • GifDrawable#getNumberOfFrames() now returns 0 when GifDrawable is recycled
  • Information included in result of GifDrawable#toString() when GifDrawable is recycled now contains zeroes only

Upgrading from 1.1.10

It is recommended (but not required) to call LibraryLoader.initialize() before using GifDrawable . Context is needed in some cases when native libraries cannot be extracted normally. See ReLinker for more details. If LibraryLoader.initialize() was not called and normal library loading fails, Context will be tried to be retrieved in fall back way which may not always work.

Upgrading from 1.1.9

int parameter loopNumber has been added to AnimationListener#onAnimationCompleted() .

Upgrading from 1.1.8

Proguard configuration not needed

Proguard configuration is now bundled with the library, you don’t need to specify it yourself.

Upgrading from 1.1.3

src XML attribute in GifTextureView has been renamed to gifSource to avoid possible conflicts with other libraries.

Upgrading from 1.0.x

Proguard configuration update

Proguard configuration has changed to:

Drawable recycling behavior change

GifDrawable now uses android.graphics.Bitmap as frame buffer. Trying to access pixels (including drawing) of recycled GifDrawable will cause IllegalStateException like in Bitmap .

Minimum SDK version changed

Minimum API level is now 8 (Android 2.2).

Rendering moved to background thread

Rendering is performed in background thread running independently from main thread so animation is running even if drawable is not drawn. However rendering is not running if drawable is not visible, see [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)). That method can be used to control drawable visibility in cases when it is not already handled by Android framework.

This library uses code from GIFLib 5.1.3 and SKIA.

Projects using android-gif-drawable

Sketch Powerful and comprehensive image loader on Android, with support for GIF, gesture zooming, block display super large image.

Want to include your project here? Fill an issue

MIT License
See LICENSE file.

About

Views and Drawable for displaying animated GIFs on Android

Источник

Оцените статью