Дельта-синхронизация крипто-дисков

Существуют разные способы зашифровать "облако". Один из них - поместить в облако крипто-диск. В предыдущей статье мы писали, почему это не всегда удобно.

Дельта синхронизация без облака

Ранее мы показывали разные способы синхронизации криптодиска между ПК и Android-устройством.

Облачный хостинг VDS за 2 минуты

Настоящий облачный VDS-хостинг от UltraVDS: тестируем производительность

Смотрим плавность хода с помощью BMW Rheingold

Всем знакома ситуация, когда двигатель немного "троит", но пропусков зажигания нет...

Класс Drawable


Класс Drawable

Денис Колисниченко

Прошу извинения за испорченные скриншоты, но другого способа нет. Надоели твари ворующие материалы и зарабатывающие на них деньги, ничего не создав своего!

В этой статье мы поговорим о создании статической графики путем рисования в объекте View из разметки или же рисования непосредственно на канве. Анимация будет рассмотрена в следующих статьях.

Для рисования на формах и изображениях используется графическая библиотека android.graphics.drawable. Класс Drawable определяет различные виды графики, например BitmapDrawable, ShapeDrawable, LayerDrawable и др.

Существуют два способа определения и инициализации объекта Drawable. Первый заключается в использовании объектов из каталога res/drawable, а второй — в использовании XML-файла со свойствами объекта Drawable.

В Android-приложениях вы можете использовать изображения следующих фор-
матов:

  1. PNG - рекомендуемый формат;
  2. JPEG — поддерживаемый формат, но лучше использовать PNG;
  3. BMP — поддерживается, но использовать не рекомендуется из-за большого размера файлов этого формата;
  4. GIF — формат поддерживается, но его использование настоятельно не рекомендуется — его палитра всего 256 цветов, что явно мало для экрана современного смартфона (специально для dkws.org.ua). К тому же разработчики Android рекомендуют использовать формат PNG.

Примечание

Конечно, для каждого формата есть свое применение. Формат PNG отлично подходит для изображений кнопок и других элементов графического интерфейса. Формат JPEG вы будете использовать для работы с фотографиями — от него никуда не денешься. Формат BMP — это изобретение Microsoft, вот пусть сами его и используют. Только
у Microsoft есть столько дискового пространства, чтобы хранить изображения в формате BMP. Формат GIF поддерживает анимацию — это единственное его преимущество, но позже вы узнаете, что анимацию можно создать средствами Android. Поэтому вообще не вижу необходимости в этом формате.

Ресурсы изображений помещаются в каталог res/drawable. Во время компиляции программы ресурсы из этого каталога оптимизируются программой aapt. Если вам нужно использовать растровые изображения без оптимизации, поместите их в каталог res/raw — при компиляции файлы из этого каталога не будут оптимизированы утилитой aapt.

Рассмотрим подробнее процесс добавления ресурса в проект. Предположим, что нам нужно добавить в проект два файла — p1.jpg и p2.jpg. Подготовьте три варианта каждого файла — с высоким разрешением, со средним разрешением и с низким разрешением. Значение разрешения зависит от выбранной платформы и от самого мобильного устройства

Файлы с высоким разрешением нужно поместить в каталог res/drawable-hdpi, файлы с низким разрешением — в каталог res/drawable-ldpi, со средним — в каталог res/drawable-mdpi. После этого вернитесь в окно Eclipse, нажмите F5 и в области Package Explorer вы увидите добавленные файлы (рис. 1).

Теперь перейдите на вкладку Images & Media палитры компонентов и добавьте элемент ImageView. При его добавлении с помощью графического редактора разметки появится окно, в котором нужно выбрать изображение для

Рис. 7.1. Добавленные графические файлы

Рис. 7.2. Выбор ресурса

Рис. 7.3. Выбранное изображение

отображения в ImageView (рис. 2). Выбранное изображение сразу будет отображено в редакторе разметки (рис. 3).

Далее выбранное изображение появится в редакторе разметки (рис. 7.3), а в файл main.xml будет добавлен код, приведенный в листинге 1. Из листинга 1 я удалил код текстовой надписи, которая добавляется в проект по умолчанию.

Листинг 1. Пример описания элемента ImageView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context="com.sample.glava7.MainActivity" >

 

    <ImageView

        android:id="@+id/imageView1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignParentLeft="true"

        android:layout_below="@+id/textView1"

        android:layout_marginTop="159dp"

        android:src="@drawable/p2" />

 

%lt/RelativeLayout>

Обратите внимание (© Денис Колисниченко), что в новом ADT-плагине появилось новое предупреждение. В редакторе кода оно выглядит как желтый треугольник с восклицательным знаком напротив кода ImageView. Если подвести к нему указатель мыши, то вы увидите само предупреждение:

Missing contentDescription attribute on image

Данное предупреждение не приведет к какой-либо ошибке при сборке проекта и можно проигнорировать. Но если и вам не нравятся какие-либо предупреждения и недостатки кода, тогда сначала нужно в файл res/values/strings.xml добавить новую строку desc. То есть в файл strings.xml нужно добавить строку:

<string name="desc">Описание картинки</string>

Это и будет описание картинки, как вы уже догадались. После этого нужно обязательно сохранить этот файл, нажав Ctrl + S. Затем в файл разметки необходимо добавить атрибут contentDescription для ImageView и сохранить файл разметки:

android:contentDescription="@string/desc"

После этого предупреждение больше не будет появляться. Полный код ImageView выглядит так:

<ImageView

        android:id="@+id/imageView1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

         android:contentDescription="@string/desc"

        android:layout_alignParentLeft="true"

        android:layout_below="@+id/textView1"

        android:layout_marginTop="159dp"

        android:src="@drawable/p2" />

Напрямую значение атрибута contentDescription указывать не нужно, потому что получите еще одно предупреждение. Подробнее об этом атрибуте можно прочитать здесь:

http://developer.android.com/reference/android/view/View.html#attr_android:cont‌​entDescription

Теперь продолжим исследовать область ImageView. Имя ресурса задается параметром android:src.

В коде программы объект Drawable инициализируется так:

Resources R = mContext.getResources();

Drawable exitImage = R.getDrawable(R.drawable.exit_image);

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

Узнать максимальную высоту и ширину ImageView можно методами:

int getMaxHeight()

int getMaxWidth()

Метод setImageURI() может использоваться для загрузки изображения с определенного URL, однако это может привести к задержкам, связанным с передачей данных по сети. Однако использование этого метода довольно ограничено и URI должен указываться в формате, понятном операционной системе Android, это не обычный URI, к которым мы привыкли при работе в Интернете. Другими словами, если вы укажете URL вроде http://server.ru/image.jpg, у вас ничего не выйдет.

Также некорректно работают метод setImageURI(). Вы думаете, что можно попробовать загрузить картинку так:

imageView.setImageURI(Uri.fromFile(file));

но у вас ничего не получается? Вы не один такой. Данная проблема описана здесь:

https://code.google.com/p/android/issues/detail?id=2733

К сожалению, она пока не решена, поэтому приходится "изощряться". Итак, что нужно сделать, чтобы загрузить изображение с URI? Нужно сначала получить объект Drawable, а потом передать его методу getDrawable():

Uri imgUri=Uri.parse("file:///data/data/MYFOLDER/myimage.png");

d = Drawable.createFromPath(imgUri.getPath());

ImgView.getDrawable(d);

Вместо локального файла можно указать удаленный URL. Можно также сначала получить Bitmap из изображения, а потом конвертировать его в Drawable. В группе разработчиков Google приводится решение для этого в виде следующей удобной функции, которая возвращает Bitmap изображения, заданного строкой url:

private Bitmap getImageBitmap(String url) {

            Bitmap bm = null;

            try {

                URL aURL = new URL(url);

                URLConnection conn = aURL.openConnection();

                conn.connect();

                InputStream is = conn.getInputStream();

                BufferedInputStream bis = new BufferedInputStream(is);

                bm = BitmapFactory.decodeStream(bis);

                bis.close();

                is.close();

           } catch (IOException e) {

               Log.e(TAG, "Error getting bitmap", e);

           }

           return bm;

        }

После того, как Bitmap получен - половина дела сделана. Осталось конвертировать его в Drawable. Это можно сделать так:

Bitmap b = getImageBitmap("http://server.ru/image.jpg");

Drawable d = new BitmapDrawable(getResources(),b);

Теперь у нас есть объект d, который можно передать методу getDrawable().