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