English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Когда нужно выбирать местные изображения для приложения, первым делом, конечно, приходит в голову системный альбом, но Android-телефоны разнообразны, а также улучшение разрешения камеры, проблемы с возвращением больших изображений и другие аномальные факторы, что делает адаптацию к моделям телефона затруднительной. Вечный мыл и QQ相继 интегрировали функцию выбора изображений в свои приложения, отказавшись от системного выбора изображений. Здесь был сделан выборщик изображений для местной папки, вдохновленный QQ. PS: кто-то сказал, что "подражание" написали как "защита", сегодня特意 проверил, чтобы не было ошибок.
Сначала один пример效果图, без изображения – это не правда ~~~
Достигаемый эффект примерно такой:
1. Односелект: Перейти в папку выбора изображений на локальном диске, выбрать папку и перейти в все изображения в этой папке, выбрать изображение и вернуться к информации о его адресе.
2. Многоселект: Перейти в папку с изображениями, выбрать папку, выбрать изображение, нажать на маленький кружок в верхнем правом углу,选中 это изображение, нажать на другое место изображения, чтобы увидеть его в большом размере, нажать на предварительный просмотр, чтобы увидеть выбранные изображения, можно выбирать изображения из разных папок.
Для достижения такого эффекта нужно сделать несколько вещей:
1. Чтение всех папок на локальном диске с изображениями:
这里用ContentResolver读取媒体文件
String[] columns = {MediaStore.Images.Media._ID, MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, "COUNT(1) AS count"}; String selection = "0==0) GROUP BY (" + MediaStore.Images.Media.BUCKET_ID; String sortOrder = MediaStore.Images.Media.DATE_MODIFIED; Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, null, sortOrder);
这是一个简单的SQL查询语句,按文件夹分组,并返回文件夹下图片数。
2.读取指定文件夹下所有图片:
当选择某一目录时,需要读取该目录下所有图片了。
String[] columns = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA}; /*查询文件路径包含上面指定的文件夹路径的图片--这样才能保证查询到的文件属于当前文件夹下*/ String whereclause = MediaStore.Images.ImageColumns.DATA + " like'" + folderPath + "/%'"; Log.i("queryGalleryPicture", "galleryPath:" + folderPath); Cursor corsor = c.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, whereclause, null, null);
Здесь запросы для фильтрации основаны на имени файла, изображения считаются изображениями этой папки, если путь к изображению содержит путь к папке
3. Интерактивный интерфейс
Прежде всего, при отображении всех папок, содержащих изображения, асинхронно загружаются папки с изображениями, после успешного чтения списка отображается, здесь используется RecyclerView для отображения информации о списке, при нажатии на определенный каталог читается изображение в этом каталоге, в странице просмотра изображений важно отметить, что при каждом нажатии необходимо проверить, находится ли текущее нажатое изображение в списке выбора, если да, удалить, если нет, добавить. Здесь для загрузки изображений используется开源 фреймворк ImageLoader
if (mSelectlist.contains(imageBean)) { // Если нажатый элемент уже был выбран, удалить mSelectlist.remove(imageBean); subSelectPosition(); } else { // Если изображение не в списке выбора, добавить if (mSelectlist.size() >= maxCount) { Toast.makeText(mContext, mContext.getResources().getString(R.string.publish_select_photo_max, maxCount), Toast.LENGTH_SHORT).show(); return; } mSelectlist.add(imageBean); imageBean.selectPosition = mSelectlist.size(); } // Уведомление о том, что изменен выбранный элемент notifyItemChanged(position);
Кроме того, если удаляется изображение, номер изображения на нем также изменяется, затем уведомляется о обновлении изменений UI.
При переходе из одного Activity в другое, так как нужно передать список изображений List, в котором находятся пользовательские сущности, сначала было принято решение использовать intent для передачи, но после передачи через list.get(positon).contains для сравнения, чтобы проверить, являются ли это одними и теми же объектами, всегда было differently. Поэтому здесь был определен класс наблюдателя, который сохраняет выбранные изображения и все изображения в папке, а также при просмотре больших изображений, если выбрано или отменено选中了一张 изображение, обновление уведомляется через наблюдателя.
/** * Уведомление о том, что выбор изображения изменен */ public void updateImageSelectChanged () { setChanged(); notifyObservers(imgSelectObj); }
Теперь, с этим, вы можете использовать наш изображений выборчика:
При выборе одного, вызовите его в нужном месте:
/*Выбор один, параметры соответствуют context, callback*/ FolderListActivity.startSelectSingleImgActivity(this, 2); При многосельском /*Параметры соответствуют context, код回调,传入ный список изображений, опциональное максимальное количество*/ FolderListActivity.startFolderListActivity(this, 1, null, 9);
В конце Activity's onActivityResult принимает возвращенные данные изображений:
List<ImageFolderBean> list = (List<ImageFolderBean>) data.getSerializableExtra("list");
Адрес для загрузки исходного кода:
https://github.com/JarekWang/photoselect
Вышеизложенное - это полное описание, которое редактор предоставляет给大家 о фальшивом QQ изображения выборчика Android, надеюсь, это поможет вам!
Заявление: контент этой статьи взяты из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, сайт не обладает правами собственности, не был отредактирован вручную, не несет ответственности за соответствующие юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для жалоб, и предоставьте соответствующие доказательства. Как только будет установлено, что это правда, сайт немедленно удалят涉嫌侵权的内容。