کتابخانه Matisse

354

ماتیس یک ابزار برای انتخاب تصویر و ویدیو در اندروید است. شما می توانید :

  • در اکتیتویتی و یا فرگمنت از آن استفاده کنید
  • انتخاب تصاویر از جمله JPEG، PNG، GIF و فیلم ها از جمله MPEG، MP4
  • تم های مختلف را اعمال کنید، از جمله دو تم ساخته شده و تم سفارشی
  • بارگذاری تصاویر مختلف
  • قوانین فیلتر سفارشی را تعریف کنید
  • ...

گام اول : گرفتن Permission ها


این کتابخانه به دسترسی های زیر نیاز دارد :

  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.WRITE_EXTERNAL_STORAGE

گام دوم : افزودن Matisse


Glide و Matisse را به عنوان dependency در فایل build.gridle خود پیاده سازی کنید.

        
            dependencies {
               implementation 'com.zhihu.android:matisse:0.5.1'
               implementation 'com.github.bumptech.glide:glide:4.7.1'
            }
        
    

گام سوم : اضافه نمودن متن خطا


در فایل strings.xml خط زیر را اضافه نمایید .

        
               < string name="error_gif">x or y bound size should be at least %1$dpx and file size should be no more than %2$sM< /string>
        
    

گام چهارم : ساخت کلاس GifSizeFilter


در پروژه خود یک کلاس به اسم GifSizeFilter ایجاد کنید و کد های زیر را در آن جایگذاری کنید .

        
import android.content.Context;
import android.graphics.Point;

import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.filter.Filter;
import com.zhihu.matisse.internal.entity.IncapableCause;
import com.zhihu.matisse.internal.entity.Item;
import com.zhihu.matisse.internal.utils.PhotoMetadataUtils;

import java.util.HashSet;
import java.util.Set;

public class GifSizeFilter extends Filter {

    private int mMinWidth;
    private int mMinHeight;
    private int mMaxSize;

    public GifSizeFilter(int minWidth, int minHeight, int maxSizeInBytes) {
        mMinWidth = minWidth;
        mMinHeight = minHeight;
        mMaxSize = maxSizeInBytes;
    }

    @Override
    public Set< MimeType> constraintTypes() {
        return new HashSet< MimeType>() {{
            add(MimeType.GIF);
        }};
    }

    @Override
    public IncapableCause filter(Context context, Item item) {
        if (!needFiltering(context, item))
            return null;

        Point size = PhotoMetadataUtils.getBitmapBound(context.getContentResolver(), item.getContentUri());
        if size.x < mMinWidth || size.y < mMinHeight || item.size > mMaxSize {
            return new IncapableCause(IncapableCause.DIALOG, context.getString(R.string.error_gif, mMinWidth,
                    String.valueOf(PhotoMetadataUtils.getSizeInMB(mMaxSize))));
        }
        return null;
    }

}

        
    

گام پنجم : ساخت کلاس Glide4Engine


در صورتی که از ورژن ۴ Glide استفاده می کنید در پروژه خود یک کلاس به اسم Glide4Engine ایجاد کنید و کد های زیر را در آن جایگذاری کنید .

        
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.request.RequestOptions;
import com.zhihu.matisse.engine.ImageEngine;

/**
 * {@link ImageEngine} implementation using Glide.
 */

public class Glide4Engine implements ImageEngine {

    @Override
    public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
        Glide.with(context)
                .asBitmap() // some .jpeg files are actually gif
                .load(uri)
                .apply(new RequestOptions()
                        .override(resize, resize)
                        .placeholder(placeholder)
                        .centerCrop())
                .into(imageView);
    }

    @Override
    public void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView,
                                 Uri uri) {
        Glide.with(context)
                .asBitmap() // some .jpeg files are actually gif
                .load(uri)
                .apply(new RequestOptions()
                        .override(resize, resize)
                        .placeholder(placeholder)
                        .centerCrop())
                .into(imageView);
    }

    @Override
    public void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        Glide.with(context)
                .load(uri)
                .apply(new RequestOptions()
                        .override(resizeX, resizeY)
                        .priority(Priority.HIGH)
                        .fitCenter())
                .into(imageView);
    }

    @Override
    public void loadGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        Glide.with(context)
                .asGif()
                .load(uri)
                .apply(new RequestOptions()
                        .override(resizeX, resizeY)
                        .priority(Priority.HIGH)
                        .fitCenter())
                .into(imageView);
    }

    @Override
    public boolean supportAnimatedGif() {
        return true;
    }

}

        
    

گام ششم : چگونگی استفاده


در کد اکتیویتی و یا فرگمنت خود کد زیر را وارد نمایید .

        
Matisse.from(LaunchActivity.this) //Context
                .choose(MimeType.ofAll())
                .countable(true)
                .maxSelectable(1)
                .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
                .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
                .thumbnailScale(0.85f)
                .imageEngine(new Glide4Engine())
                .theme(R.style.Matisse_Dracula) // R.style.Matisse_Zhihu
                .setOnCheckedListener(new OnCheckedListener() {
                    @Override
                    public void onCheck(boolean isChecked) {
                        // DO SOMETHING IMMEDIATELY HERE
                        Log.i("Oxima", "onCheck: isChecked=" + isChecked);
                    }
                })
                .forResult(REQUEST_CODE_CHOOSE);
        
    

پس از انتخاب تصاویر توسط کاربر نتیجه را در متد onActitivityResult به صورت زیر دریافت کنید‌:

        
 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK {
            List< String> pathes = Matisse.obtainPathResult(data);  // path of images that user selected
        }
    }
        
    
پیوست ها :
  • این مقاله دارای پیوست نمی باشد.
loder | اُکسیما
»» نویسنده مقاله
حسین رئیسی | اُکسیما

حسین رئیسی
»» پشتیبانی مقاله

تیم پشتیبانی اُکسیما به صورت 24 ساعت در هر زمان و مکان، پاسخگوی تمامی سوالات و ابهامات شما در مورد این مقاله خواهند بود. بدین منظور شما می توانید از طریق روش های زیر از پشتیبانی فنی این مقاله برخوردار گردید. تیم پشتیبانی این اطمینان خاطر را به شما دانشجویان گرامی خواهند داد که در سریع ترین زمان ممکن پاسخگوی شما عزیزان باشند.


به اشتراک بگذارید ...

دوستان و همراهان گرامی : آیا تمایل دارید این مقاله را با دوستان و آشنایان خود در تلگرام به اشتراک بگذارید؟

مقاله های پیشنهادی

یک ابزار جمع و جور اندروید برای ساخت و جمع کردن چند ضلعی های منظم با امکاناتی نظیر : تعداد ضلع (≥ 3) - مختصات مرکز - شعاع بیرونی (مرکز به رأس) - گرد کردن گوشه ها و ...

حسین رئیسی

230

کتابخانه DialogBuilder یک کتابخانه سبک و ساده در عین حال با قابلیت های کاستوم سازی بسیار برای نمایش دایالوگ به دو صورت AlertDialog و BottomSheet در اندروید می باشد .

حسین رئیسی

148

حتی اکنون که Kotlin یک زبان رسمی و پشتیبانی شده برای نوشتن برنامه های اندروید است، شما هنوز هم می توانید احساس کنید که دلایل کافی برای تغییر وجود ندارد. جاوا ثابت کرده است که در طول تمام این سالها به خوبی کار می کند، پس چرا باید از کاتلین استفاده کنیم ؟ در این مقاله دلایلی را مطرح می کنیم است ،علی رغم نظر بسیاری از افراد ، استفاده از کاتلین یکی از بهترین چیزهایی است که می توانید انجام دهید.

حسین رئیسی

310