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. واجهة المستخدم UI

首先在展示所有包含图片的文件夹时,异步加载有图片的文件夹,读取成功后列表展示,这里用的RecyclerView展示列表信息,点击某一目录时,在读取改目录下的图片,在图片展示页里,需要注意的是,每次点击判断当前点击图片是否已在选择列表中,若在,删除,不在,添加。这里图片加载用了开源框架ImageLoader

if (mSelectlist.contains(imageBean)) { //点击的item为已选过的图片时,删除
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,list里是自定义实体类,刚开始考虑过用intent传递,但是intent传递后,通过list.get(positon).contains比较是否同一对象时,始终是不同对象,大家可以去验证下。所以这里定义了一个观察者的类,去保存选择的图片和文件夹下的所有图片,同时查看大图时,若选择了一张或者取消选择了一张图,通过观察者通知更新即可

/**
* 通知图片选择已改变
*/
public void updateImageSelectChanged () {
setChanged();
notifyObservers(imgSelectObj);
}

حسنًا، مع ما تم ذكره أعلاه، يمكنك استخدام ملاحظة اختيار الصور الخاصة بنا:

في حالتي الإختيار الفردي، يمكنك تفعيله في المكان المطلوب:

/*الإختيار الفردي، المتغيرات المطلوبة هي لـ context، رمز التتبع*/
FolderListActivity.startSelectSingleImgActivity(this, 2);
في حالتي الإختيار المتعدد:
/*المتغيرات المطلوبة هي لـ context، رمز التتبع، القائمة المقدمة من الصور، عدد الأعمدة القصوى المسموح بها*/
FolderListActivity.startFolderListActivity(this, 1, null, 9);

في النهاية، يتم استقبال بيانات الصور المعدة من.onActivityResult Activity:

List<ImageFolderBean> list = (List<ImageFolderBean>) data.getSerializableExtra("list");

عنوان تحميل الشيفرة المصدرية:

https://github.com/JarekWang/photoselect

ما تم ذكره أعلاه هو جميع التوضيحات التي قدمها المحرر لاختيار الصور المقلدة لـ QQ Android، آمل أن يكون مفيدًا لكم جميعًا!

البيان: محتوى هذا المقال تم جمعه من الإنترنت، يملك حقوق الطبع والنشر أصحاب المشاريع، يتم جمع المحتوى من إسهامات المستخدمين عبر الإنترنت وتم تحميله بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا وجدت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لتقديم الشكوى، وقدم الدليل على الأدلة، إذا تم التحقق من ذلك، فإن هذا الموقع سيقوم بإزالة المحتوى المزعوم بسرعة.

تحب أن تفضل