کتابخانه Matisse

497

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

  • در اکتیتویتی و یا فرگمنت از آن استفاده کنید
  • انتخاب تصاویر از جمله 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 ساعت در هر زمان و مکان، پاسخگوی تمامی سوالات و ابهامات شما در مورد این مقاله خواهند بود. بدین منظور شما می توانید از طریق روش های زیر از پشتیبانی فنی این مقاله برخوردار گردید. تیم پشتیبانی این اطمینان خاطر را به شما دانشجویان گرامی خواهند داد که در سریع ترین زمان ممکن پاسخگوی شما عزیزان باشند.


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

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

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

چهار روش وجود دارد که می توانید به وسیله آن ها با محصول و خدمات خود وارد بازار شوید : ایجاد مطلوبیت ، قیمت گذاری مناسب ، واقع بینی مشتریان و ارسال ارزش واقعی مواردی هستند که به کمک آن ها می توانید خدمات و محصولات خود را وارد بازار کنید .

حسین رئیسی

401

شما ممکن است شنیده باشید که پایتون محبوبیت زیادی را به دست آورده است، اما آیا می دانستید که در حال حاضر محبوب ترین زبان آموزشی و مقدماتی در دانشگاه های آمریکا است ؟ همینطور این زبان ، با توجه به بررسی IEEE ، چهارمین زبان محبوب دنیا بعد از زبان های کلاسیک و قدیمی جاوا، C و C ++ است ؟

حسین رئیسی

700

FancyButton یک باتن قدرتمند برای اندروید هست با ویژگی های زیر : Border (stroke, radius, color)- Background (normal, focus)- Icon (Drawable, font Icon)- Icon (Position, size)- Icon Size- Icon Padding

حسین رئیسی

475