Tngram用法(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39507260/article/details/89297106

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();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39507260/article/details/89297106