版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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();
}
}