[Android]1行のコードでGifダイナミックマップを作成する

4015 ワード

開編前に効果を見ておきます.以下の例のプログラムApkは、本明細書の下部にダウンロードアドレスを見つけることができる.
呆然とした顔をしている.gifはどのように生成されますか?
GIF.gif
ところで、それは2016年の頃、自分が表情包斗図を使うのが好きだったので、便宜上、表情画像を作成するアプリを開発しました.機能は簡単ですが実用的で、私の多くの友达もダウンロードして使っています.それから私はグーグルをして、良い案がないことに気づいて、そこでこの機能はあまりにも監視しました.言いたいのは、こんなに長く引きずって、今週末に2日間かけてこの機能を実現したということです.
AndroidプラットフォームはGifに対するサポートがよく、既存のJava Apiが使えないので、NDKを橋渡しとしてC++言語で32-bit ARGBピクチャをColor Quantizationし、Gifダイナミックマップ(256色域)に変換しました.この項目の色彩変換アルゴリズムはGifflen@Bitmap color reduction and GIF encodingに基づいている.
GifflenのC++ソースコードをカスタマイズして修正し、native library(すなわち.soファイル)をコンパイルしてAPKにパッケージする.Androidシステム上でGif動図を簡単に作成できます.本プロジェクトのNDK部分コードはCMake方式で構築する.Android Studio2.2バージョン以降はNDKプログラミングをサポートしています.体験してみると素晴らしいです.
使用方法
1.ダイナミックリンクライブラリの追加
私がコンパイルしたダイナミックリンクライブラリファイルを使用すると、サポートarm-v8aarmaibarmabi-v7amipsmips64x86x86-64など7つのプラットフォームがあり、必要に応じて対応するnative libraryをプロジェクトに追加することができます.
2.Gifflenツールクラスの追加
アプリケーション層のすべてのインタフェースはGifflenにあります.JAvaというクラスで、あなたがしなければならないのは、自分のプロジェクトのapp/main/javaパスの下にcom/lchad/gifflenフォルダを作成し(このパスは重要でアルファベットが1文字も間違ってはいけない)、Gifflen.JAvaはこの特殊なパスにコピーします.注意してください.Gifflen.JAvaは以上の指定位置(すなわちyour-project-name/app/main/java/com/lchad/gifflen)の下に置く、そうでないと実行時にJNIがエラーを報告し、対応するjniメソッドが見つからない.この点は特に注意しなければならない.
3.ファイルの操作にかかわるため、Androidの読み書き外部記憶権限を事前に取得する必要がある、Android Manifest.xmlに2行追加します.
    
    

Android 6なら0以上は動的申請権限に注意する必要がある.
 ActivityCompat.requestPermissions(MainActivity.this, new String[]{
                            Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_PERMISSIONS);

**4.初期化ツール類Gifflen**の初期化はBuilderモードを採用しており、使い心地は非常に爽やかである.
Gifflen mGiffle = new Gifflen.Builder()
                        .color(mColor)   //     2~256,    2     .
                        .delay(mDelayTime) //              .
                        .quality(mQuality) //      quality .
                        .width(500)     //  Gif     (  ).
                        .height(500)       //  Gif     (  ).
                        .build();

5.Gifピクチャの作成開始
  • Fileリストから作成
  •         List files = getFileList();
            mGiffle.encode(320, 320, "target path", files);
            mGiffle.encode("target path", files); 
    
  • Uriリストから作成
  •         List uris = getUriList();
            mGiffle.encode(context, 500, 500, uris);
            mGiffle.encode(context, "target path", uris);
    
  • TypeArrayから作成
  •      TypeArra mDrawableList = getResources().obtainTypedArray(R.array.source);
         mGiffle.encode(MainActivity.this, "target path", 500, 500, mDrawableList);
         mGiffle.encode(MainActivity.this, "target path", mDrawableList);
    
  • Bitmap配列から作成
  •         Bitmap[] bitmaps = getBitmaps();
            mGiffle.encode("target path", 500, 500, bitmaps);
            mGiffle.encode("target path", bitmaps);
        //  :     Bitmap       ,       OOM.
    
  • drawable id配列から作成
  •     int[] drawableIds = new int[]{
                    R.drawable.mengbi1,
                    R.drawable.mengbi2,
                    R.drawable.mengbi3};
            mGiffle.encode(context, "target path", 500, 500, drawableIds);
            mGiffle.encode(context, "target path", drawableIds);
    

    以上の5つの作成方法はいずれもリロード(本質的にはBitmapに対して操作)をサポートする、幅と高さはencode()の場合にデフォルトであり、この場合にはGifflenの作成時に入力値が使用され、Gifflenの作成時にまだ値が伝達されていない場合にはデフォルト値320が使用される.
    例Apkプログラム
    ダウンロード
    ソースコード(GitHub)スター、ティイス、PRへようこそ
    Gifflen-Android