Tngram用法(一)

Tngram用法(一)

1.依賴庫

	implementation 'com.alibaba.android:tangram:2.0.5@aar'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.3'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
    implementation 'com.squareup.picasso:picasso:2.3.2'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    implementation 'com.jakewharton:butterknife:8.8.1'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.alibaba:fastjson:1.1.70.android'
    implementation 'com.android.support:recyclerview-v7:28.3.1'
    implementation('com.alibaba.android:virtual-common:1.0.11') {
        changing = true
    }
    implementation ('com.alibaba.android:virtualview:1.0.5@aar') {
        exclude group: 'com.android.support'
    }
    implementation ('com.alibaba.android:vlayout:1.2.8@aar') {
        exclude group: 'com.android.support'
    }
    implementation ('com.alibaba.android:ultraviewpager:1.0.7.7@aar') {
        exclude group: 'com.android.support'
    }
}
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '28.0.0'
            }
        }
    }
}

2.代碼

//全局初始化一下圖片加載器
TangramBuilder.init(this.getApplicationContext(), new IInnerImageSetter() {
            @Override
            public <IMAGE extends ImageView> void doLoadImageUrl(@NonNull IMAGE view, @Nullable String url) {
                Picasso.with(MyBaseActivity.this).load(url).into(view);
            }
        },ImageView.class);
public class MainActivity extends MyBaseActivity {

    private TangramBuilder.InnerBuilder mBuilder;
    private TangramEngine mEngine;
    @BindView(R.id.id_recycler_view)
    RecyclerView mRecyclerView;

    @Override
    protected int getContentViewId() {
        return R.layout.activity_main;
    }

    /**
     * Picasso的Target
     */
    private static class ImageTarget implements Target {
    	//Tangram中自定義的Image容器和監聽
        ImageBase mImageBase;
        ImageLoader.Listener mListener;

        public ImageTarget(ImageBase imageBase) {
            mImageBase = imageBase;
        }

        public ImageTarget(ImageLoader.Listener listener) {
            mListener = listener;
        }

        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        		//Picasso加載圖片的時候調用自定義ImageBase容器來設置圖片,回掉監聽
                mImageBase.setBitmap(bitmap,true);
                if (mListener != null){
                    mListener.onImageLoadSuccess(bitmap);
                }
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            if (mListener != null){
                mListener.onImageLoadFailed();
            }
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {

        }
    }

    @Override
    protected void initView() {
    	//TangramBuilder負責註冊Card爲type,初始化各種類
        mBuilder = TangramBuilder.newInnerBuilder(MainActivity.this);
        //註冊自定義cell到card:TextView,ImageView,ViewHolder等,用於顯示Json的item數據,
        mBuilder.registerCell("1", MyTextView.class);
        mBuilder.registerCell("2", SimpleImgView.class);
        mBuilder.registerCell("4", RatioTextView.class);
        mBuilder.registerCell("10", SimpleImgView.class);
        mBuilder.registerCell("110", TestViewHolderCell.class,
                new ViewHolderCreator<>(R.layout.item_holder, TestViewHolder.class, TextView.class));
        //VVCard extends OneItemCard
        mBuilder.registerVirtualView("vvtest");
        mEngine = mBuilder.build();
        mEngine.bindView(mRecyclerView);
        mEngine.getLayoutManager().setFixOffset(0, 20, 0, 0);
        //設置卡片和數據加載支持
        mEngine.addCardLoadSupport(new CardLoadSupport());
        //所有點擊事件都會回到defaultClick中,在這裏來統一寫點擊事件邏輯
        mEngine.addSimpleClickSupport(new MyClickSupport());
        //事件曝露,最終回到defaultExposureCell中
        mEngine.addExposureSupport(new MyExposureSupport());
        //設置ImageLoader圖片加載器
        mEngine.getService(VafContext.class).setImageLoaderAdapter(new ImageLoader.IImageLoaderAdapter() {
            private List<ImageTarget> cache = new ArrayList<>();

            @Override
            public void bindImage(String uri, ImageBase imageBase, int reqWidth, int reqHeight) {
                RequestCreator requestCreator = Picasso.with(MainActivity.this).load(uri);
                if (reqHeight > 0 && reqWidth > 0){
                    requestCreator.resize(reqWidth,reqHeight);
                }
                ImageTarget target = new ImageTarget(imageBase);
                cache.add(target);
                requestCreator.into(target);
            }

            @Override
            public void getBitmap(String uri, int reqWidth, int reqHeight, ImageLoader.Listener lis) {
                RequestCreator requestCreator = Picasso.with(MainActivity.this).load(uri);
                if (reqHeight > 0 && reqWidth > 0){
                    requestCreator.resize(reqWidth,reqHeight);
                }
                ImageTarget target = new ImageTarget(lis);
                cache.add(target);
                requestCreator.into(target);
            }
        });
		//獲取Json數據並設置到TangramEmgine,進而綁定數據
        try {
            String json = new String(getAssertsFile(this, "data.json"));
            //org.json.JsonArray
            JSONArray jsonArray = new JSONArray(json);
            mEngine.setData(jsonArray);
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void addListener() {
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //將RV的滾動事件交給TangramEmgine
                mEngine.onScrolled();
            }
        });
    }

    @Override
    protected void beforLayout() {

    }

    /**
     * 從Assets獲取byte[]數據
     */
    public static byte[] getAssertsFile(Context context, String fileName) {
        InputStream inputStream = null;
        AssetManager assetManager = context.getAssets();
        try {
            inputStream = assetManager.open(fileName);
            if (inputStream == null) {
                return null;
            }

            BufferedInputStream bis = null;
            int length;
            try {
                bis = new BufferedInputStream(inputStream);
                length = bis.available();
                byte[] data = new byte[length];
                bis.read(data);

                return data;
            } catch (IOException e) {

            } finally {
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (Exception e) {

                    }
                }
            }

            return null;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mEngine.destroy();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章