Commit 467d7a14 authored by fallenstardust's avatar fallenstardust

添加萌卡新闻轮播图

parent e8db0845
package cn.garymb.ygomobile.bean;
/**
* Create By feihua On 2021/11/8
*/
public class Header {
public static final String HEADER_AUTHORIZATION = "Authorization";
public static final int HEADER_POSITION_AUTHORIZATION = 0;
private String name;
private String value;
public Header(int namePosition, String value) {
this.value = value;
setName(namePosition);
}
public String getName() {
return name;
}
public void setName(int namePosition) {
switch (namePosition) {
case HEADER_POSITION_AUTHORIZATION:
this.name = HEADER_AUTHORIZATION;
break;
default:
this.name = "";
}
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
......@@ -106,8 +106,8 @@ public abstract class HomeActivity extends BaseActivity implements OnDuelAssista
bottomNavigationBar
.addItem(new BottomNavigationItem(R.drawable.ic_home, R.string.mc_home))
.addItem(new BottomNavigationItem(R.drawable.ic_search, R.string.search))
.addItem(new BottomNavigationItem(R.drawable.ic_album, R.string.deck_manager))
.addItem(new BottomNavigationItem(R.drawable.ic_add, R.string.mycard))
.addItem(new BottomNavigationItem(R.drawable.ic_add, R.string.deck_manager))
.addItem(new BottomNavigationItem(R.drawable.mycard, R.string.mycard))
.addItem(new BottomNavigationItem(R.drawable.ic_settings, R.string.settings))
.setActiveColor(R.color.holo_blue_bright)
.setBarBackgroundColor(R.color.transparent)
......
......@@ -6,10 +6,13 @@ import static cn.garymb.ygomobile.Constants.ORI_PICS;
import static cn.garymb.ygomobile.Constants.ORI_REPLAY;
import static cn.garymb.ygomobile.ui.home.ResCheckTask.getDatapath;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
......@@ -20,6 +23,7 @@ import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
......@@ -30,6 +34,7 @@ import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.stx.xhb.androidx.XBanner;
import com.tubb.smrv.SwipeMenuRecyclerView;
import org.greenrobot.eventbus.EventBus;
......@@ -39,6 +44,7 @@ import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import cn.garymb.ygodata.YGOGameOptions;
......@@ -53,14 +59,15 @@ import cn.garymb.ygomobile.bean.events.ServerInfoEvent;
import cn.garymb.ygomobile.lite.BuildConfig;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.loader.ImageLoader;
import cn.garymb.ygomobile.ui.activities.FileLogActivity;
import cn.garymb.ygomobile.ui.activities.WebActivity;
import cn.garymb.ygomobile.ui.adapters.ServerListAdapter;
import cn.garymb.ygomobile.ui.adapters.SimpleListAdapter;
import cn.garymb.ygomobile.ui.cards.CardDetailRandom;
import cn.garymb.ygomobile.ui.mycard.McNews;
import cn.garymb.ygomobile.ui.mycard.MyCard;
import cn.garymb.ygomobile.ui.mycard.mcchat.util.ImageUtil;
import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.VUiKit;
import cn.garymb.ygomobile.ui.preference.SettingsActivity;
import cn.garymb.ygomobile.ui.widget.Shimmer;
import cn.garymb.ygomobile.ui.widget.ShimmerTextView;
import cn.garymb.ygomobile.utils.FileUtils;
......@@ -72,6 +79,13 @@ import ocgcore.data.Card;
public class HomeFragment extends BaseFragemnt implements View.OnClickListener {
private static final int ID_HOMEFRAGMENT = 0;
private static final int TYPE_BANNER_QUERY_OK = 0;
private static final int TYPE_BANNER_QUERY_EXCEPTION = 1;
private static final int TYPE_RES_LOADING_OK = 2;
private static final String ARG_MC_NEWS_LIST = "mcNewsList";
private boolean isMcNewsLoadException = false;
ShimmerTextView tv;
Shimmer shimmer;
protected SwipeMenuRecyclerView mServerList;
......@@ -80,17 +94,22 @@ public class HomeFragment extends BaseFragemnt implements View.OnClickListener {
private CardManager mCardManager;
private CardDetailRandom mCardDetailRandom;
private ImageLoader mImageLoader;
//轮播图
private CardView cv_banner;
private TextView tv_banner_loading;
private XBanner xb_banner;
private ArrayList<McNews> mcNewsList;
//ygopro功能
CardView cv_game;
CardView cv_bot_game;
CardView cv_watch_replay;
private CardView cv_game;
private CardView cv_bot_game;
private CardView cv_watch_replay;
//辅助功能
CardView cv_download_ex;
CardView cv_reset_res;
private CardView cv_download_ex;
private CardView cv_reset_res;
//外连
CardView cv_donation;
CardView cv_join_QQ;
CardView cv_help;
private CardView cv_donation;
private CardView cv_join_QQ;
private CardView cv_help;
@Nullable
@Override
......@@ -101,8 +120,8 @@ public class HomeFragment extends BaseFragemnt implements View.OnClickListener {
layoutView = inflater.inflate(R.layout.main_horizontal_fragment, container, false);
else
layoutView = inflater.inflate(R.layout.fragment_home, container, false);
initView(layoutView, savedInstanceState);
initBanner(layoutView, savedInstanceState);
initView(layoutView);
//event
if(!EventBus.getDefault().isRegistered(this)){//加上判断
EventBus.getDefault().register(this);
......@@ -110,7 +129,7 @@ public class HomeFragment extends BaseFragemnt implements View.OnClickListener {
return layoutView;
}
private void initView(View view, Bundle saveBundle) {
private void initView(View view) {
//服务器列表
mServerList = view.findViewById(R.id.list_server);
mServerListAdapter = new ServerListAdapter(getContext());
......@@ -165,6 +184,88 @@ public class HomeFragment extends BaseFragemnt implements View.OnClickListener {
mCardManager = DataManager.get().getCardManager();
}
//轮播图
public void initBanner(View view, Bundle saveBundle){
xb_banner = view.findViewById(R.id.xb_banner);
cv_banner = view.findViewById(R.id.cv_banner);
tv_banner_loading = view.findViewById(R.id.tv_banner_loading);
tv_banner_loading.setOnClickListener(this);
cv_banner.post(() -> {
ViewGroup.LayoutParams layoutParams = cv_banner.getLayoutParams();
layoutParams.width = cv_banner.getWidth();
layoutParams.height = layoutParams.width / 3;
cv_banner.setLayoutParams(layoutParams);
});
xb_banner.setOnItemClickListener((banner, model, v, position) ->
WebActivity.open(getContext(), "新闻", mcNewsList.get(position).getNews_url())
);
xb_banner.loadImage((banner, model, v, position) -> {
TextView tv_time, tv_title, tv_type;
ImageView iv_image;
tv_time = v.findViewById(R.id.tv_time);
tv_title = v.findViewById(R.id.tv_title);
tv_type = v.findViewById(R.id.tv_type);
iv_image = v.findViewById(R.id.iv_image);
McNews mcNews = mcNewsList.get(position);
ImageUtil.setImageAndBackground(getContext(), mcNews.getImage_url(), iv_image);
tv_time.setText(mcNews.getCreate_time());
tv_title.setText(mcNews.getTitle());
tv_type.setVisibility(View.GONE);
});
if (saveBundle == null) {
findMcNews();
} else {
HomeFragment.this.mcNewsList = (ArrayList<McNews>) saveBundle.getSerializable(ARG_MC_NEWS_LIST);
if (mcNewsList != null)
handler.sendEmptyMessage(TYPE_BANNER_QUERY_OK);
else
findMcNews();
handler.sendEmptyMessage(TYPE_RES_LOADING_OK);
}
}
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case TYPE_BANNER_QUERY_OK:
tv_banner_loading.setVisibility(View.GONE);
xb_banner.setBannerData(R.layout.item_banner_main, mcNewsList);
break;
case TYPE_BANNER_QUERY_EXCEPTION:
tv_banner_loading.setText("加载失败,点击重试");
isMcNewsLoadException = true;
break;
}
}
};
private void findMcNews() {
isMcNewsLoadException = false;
tv_banner_loading.setVisibility(View.VISIBLE);
tv_banner_loading.setText("加载中");
MyCard.findMyCardNews((myCardNewsList, exception) -> {
Message message = new Message();
if (TextUtils.isEmpty(exception)) {
while (myCardNewsList.size() > 5) {
myCardNewsList.remove(myCardNewsList.size() - 1);
}
HomeFragment.this.mcNewsList = (ArrayList<McNews>) myCardNewsList;
message.what = TYPE_BANNER_QUERY_OK;
} else {
Log.e("HomeFragemnt", "查询失败" + exception);
message.obj = exception;
message.what = TYPE_BANNER_QUERY_EXCEPTION;
}
handler.sendMessage(message);
});
}
public void joinRoom(int position) {
ServerInfo serverInfo = mServerListAdapter.getItem(position);
if (serverInfo == null) {
......@@ -561,6 +662,10 @@ public class HomeFragment extends BaseFragemnt implements View.OnClickListener {
startActivity(intent);
}
break;
case R.id.tv_banner_loading:
if (isMcNewsLoadException)
findMcNews();
break;
}
}
}
package cn.garymb.ygomobile.ui.mycard;
import com.stx.xhb.androidx.entity.BaseBannerInfo;
import java.io.Serializable;
public class McNews implements BaseBannerInfo, Serializable {
private String id;
private String title;
private String message;
private String news_url;
private String image_url;
private int type;
private String create_time;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
setNews_url(MyCard.getMycardPostUrl(id));
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getCreate_time() {
return create_time;
}
public void setCreate_time(String create_time) {
this.create_time = create_time;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getNews_url() {
return news_url;
}
public void setNews_url(String news_url) {
this.news_url = news_url;
}
public String getImage_url() {
return image_url;
}
public void setImage_url(String image_url) {
this.image_url = image_url;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public Object getXBannerUrl() {
return null;
}
@Override
public String getXBannerTitle() {
return title;
}
}
package cn.garymb.ygomobile.ui.mycard;
import static junit.framework.Assert.assertEquals;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
......@@ -14,6 +16,7 @@ import android.webkit.JavascriptInterface;
import com.tencent.smtt.sdk.WebView;
import org.json.JSONArray;
import org.json.JSONException;
import java.io.BufferedInputStream;
import java.io.File;
......@@ -25,14 +28,17 @@ import java.util.ArrayList;
import java.util.List;
import cn.garymb.ygodata.YGOGameOptions;
import cn.garymb.ygomobile.App;
import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.YGOStarter;
import cn.garymb.ygomobile.bean.events.DeckFile;
import cn.garymb.ygomobile.ui.cards.DeckManagerFragment;
import cn.garymb.ygomobile.ui.plus.DefWebViewClient;
import cn.garymb.ygomobile.utils.DeckUtil;
import static junit.framework.Assert.assertEquals;
import cn.garymb.ygomobile.utils.JsonUtil;
import cn.garymb.ygomobile.utils.OkhttpUtil;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class MyCard {
......@@ -42,6 +48,51 @@ public class MyCard {
private static final String return_sso_url = "https://mycard.moe/mobile/?";
private static final String HOST_MC = "mycard.moe";
private static final String MC_MAIN_URL = "https://mycard.moe/mobile/ygopro/lobby";
public static final String DOWNLOAD_URL_EZ = "http://t.cn/EchWyLi";
public static final String MYCARD_NEWS_URL = "https://api.mycard.moe/apps.json";
public static final String MYCARD_POST_URL = "https://ygobbs.com/t/";
public static final String YGO_LFLIST_URL = "https://raw.githubusercontent.com/moecube/ygopro/server/lflist.conf";
public static final String ARG_TOPIC_LIST = "topic_list";
public static final String ARG_TOPICS = "topics";
public static final String ARG_ID = "id";
public static final String ARG_TITLE = "title";
public static final String ARG_IMAGE_URL = "image_url";
public static final String ARG_CREATE_TIME = "created_at";
public static final String ARG_OTHER = "other";
public static final String ARG_MC_NAME = "name";
public static final String ARG_MC_PASSWORD = "password";
public static final String ARG_YGOPRO = "ygopro";
public static final String ARG_ZH_CN = "zh-CN";
public static final String ARG_IMAGE = "image";
public static final String ARG_UPDATE_AT = "updated_at";
public static final String ARG_URL = "url";
public static final String ARG_NEWS = "news";
public static final String ARG_USERNAME = "username";
public static final String MYCARD_USER_DUEL_URL = "https://sapi.moecube.com:444/ygopro/arena/user";
public static final String ACTION_OPEN_MYCARD = "ygomobile.intent.action.MYCARD";
public static final String URL_MC_LOGIN = "https://accounts.moecube.com/";
public static final String ARG_SSO = "sso";
public static final String URL_MC_WATCH_DUEL_FUN = "wss://tiramisu.mycard.moe:7923/?filter=started";
public static final String URL_MC_WATCH_DUEL_MATCH = "wss://tiramisu.mycard.moe:8923/?filter=started";
public static final String URL_MC_MATCH = "https://api.mycard.moe/ygopro/match";
public static final String ARG_EVENT = "event";
public static final String ARG_DATA = "data";
public static final String HOST_MC_MATCH = "tiramisu.mycard.moe";
public static final String HOST_MC_OTHER = "tiramisu.mycard.moe";
public static final int PORT_MC_MATCH = 8911;
public static final int PORT_MC_OTHER = 7911;
public static final String ARG_LOCALE = "locale";
public static final String ARG_ARENA = "arena";
public static final String ARG_ATHLEIC = "athletic";
public static final String ARG_ENTERTAIN = "entertain";
public static final String ARG_ADDRESS = "address";
public static final String ARG_PORT = "port";
public static final String PACKAGE_NAME_EZ = "com.ourygo.ez";
private static final Charset UTF_8 = Charset.forName("UTF-8");
private final DefWebViewClient mDefWebViewClient;
private final User mUser = new User();
......@@ -82,6 +133,30 @@ public class MyCard {
};
}
//获取mc新闻列表
public static void findMyCardNews(OnMyCardNewsQueryListener onMyCardNewsQueryListener) {
OkhttpUtil.get(MYCARD_NEWS_URL, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
onMyCardNewsQueryListener.onMyCardNewsQuery(null, e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
try {
onMyCardNewsQueryListener.onMyCardNewsQuery(JsonUtil.getMyCardNewsList(json), null);
} catch (JSONException e) {
onMyCardNewsQueryListener.onMyCardNewsQuery(null, e.toString());
}
}
});
}
public interface OnMyCardNewsQueryListener {
void onMyCardNewsQuery(List<McNews> mcNewsList, String exception);
}
private static String byteArrayToHexString(byte[] array) {
StringBuilder hexString = new StringBuilder();
for (byte b : array) {
......@@ -394,4 +469,21 @@ public class MyCard {
}
}
public static String getMycardPostUrl(String id) {
return MYCARD_POST_URL + id;
}
public static String getImagePath(Context context) {
// return context.getExternalFilesDir("image").getAbsolutePath();
return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(), "YGOMobile OY").getAbsolutePath();
}
public static String getImageCachePath() {
return App.get().getExternalFilesDir("cache/image").getAbsolutePath();
}
public static String getCachePath() {
return App.get().getExternalFilesDir("cache").getAbsolutePath();
}
}
package cn.garymb.ygomobile.ui.mycard.mcchat.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.TextUtils;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.bumptech.glide.signature.ObjectKey;
import com.ourygo.assistant.util.Util;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.utils.PaletteUtil;
import cn.garymb.ygomobile.utils.glide.GlideCompat;
public class ImageUtil {
......@@ -75,5 +83,24 @@ public class ImageUtil {
}
}
public static void setImageAndBackground(Context context, String url, final ImageView im) {
if (url != null) {
Glide.with(context)
.asBitmap()
.load(url)
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
im.setImageBitmap(resource);
PaletteUtil.setPaletteColor(resource, im);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}
}
}
package cn.garymb.ygomobile.utils;
import android.text.TextUtils;
import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import cn.garymb.ygomobile.ui.mycard.McNews;
import cn.garymb.ygomobile.ui.mycard.MyCard;
public class JsonUtil {
//解析mc新闻列表
public static List<McNews> getMyCardNewsList(String json) throws JSONException {
JSONArray jsonArray = new JSONArray(json);
JSONObject newsJson = null;
List<McNews> mcNewsList = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
String id = jsonArray.getJSONObject(i).getString(MyCard.ARG_ID);
if (!TextUtils.isEmpty(id) && id.equals(MyCard.ARG_YGOPRO)) {
newsJson = jsonArray.getJSONObject(i);
}
}
if (newsJson == null)
return mcNewsList;
JSONArray newsArray = newsJson.getJSONObject(MyCard.ARG_NEWS).getJSONArray(MyCard.ARG_ZH_CN);
for (int i = 0; i < newsArray.length(); i++) {
JSONObject jsonObject1 = newsArray.getJSONObject(i);
McNews mcNews = new McNews();
mcNews.setNews_url(jsonObject1.getString(MyCard.ARG_URL));
mcNews.setImage_url(jsonObject1.getString(MyCard.ARG_IMAGE));
mcNews.setTitle(jsonObject1.getString(MyCard.ARG_TITLE));
mcNews.setCreate_time(jsonObject1.getString(MyCard.ARG_UPDATE_AT));
mcNewsList.add(mcNews);
}
return mcNewsList;
}
/*
public static McDuelInfo getUserDuelInfo(String json) {
return new Gson().fromJson(json, McDuelInfo.class);
}
public static String getDuelRoomEvent(String json) throws JSONException {
return new JSONObject(json).getString(MyCard.ARG_EVENT);
}
public static List<DuelRoom> getDuelRoomList(String json) throws JSONException {
JSONObject jsonObject = new JSONObject(json);
List<DuelRoom> duelRoomList = new ArrayList<>();
switch (getDuelRoomEvent(json)){
case DuelRoom.EVENT_INIT:
case DuelRoom.EVENT_CREATE:
JSONArray jsonArray=jsonObject.getJSONArray(MyCard.ARG_DATA);
for (int i = 0; i < jsonArray.length(); i++) {
DuelRoom duelRoom=new Gson().fromJson(jsonArray.getJSONObject(i).toString(), DuelRoom.class);
duelRoom.setArena(duelRoom.getArena());
duelRoom.setArenaType(duelRoom.getArena(),duelRoom.getId(),duelRoom.getOptions());
duelRoomList.add(duelRoom);
}
break;
case DuelRoom.EVENT_DELETE:
DuelRoom duelRoom=new DuelRoom();
duelRoom.setId(jsonObject.getString(MyCard.ARG_DATA));
duelRoom.setTitle(jsonObject.getString(MyCard.ARG_DATA));
duelRoomList.add(duelRoom);
break;
}
return duelRoomList;
}
public static YGOServer getMatchYGOServer(String body) throws JSONException {
JSONObject jsonObject=new JSONObject(body);
YGOServer ygoServer=new YGOServer();
ygoServer.setServerAddr(jsonObject.getString(MyCard.ARG_ADDRESS));
ygoServer.setPort(jsonObject.getInt(MyCard.ARG_PORT));
ygoServer.setPassword(jsonObject.getString(MyCard.ARG_MC_PASSWORD));
return ygoServer;
}*/
}
This diff is collapsed.
package cn.garymb.ygomobile.utils;
import android.graphics.Bitmap;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.palette.graphics.Palette;
/**
* Create By feihua On 2021/10/24
*/
public class PaletteUtil {
/**
* 设置图片主色调
*
* @param bitmap
* @return
*/
public static void setPaletteColor(Bitmap bitmap, final View view) {
if (bitmap == null) {
return;
}
Palette.from(bitmap).maximumColorCount(10).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@NonNull Palette palette) {
// List<Palette.Swatch> list = palette.getSwatches();
// int colorSize = 0;
// Palette.Swatch maxSwatch = null;
// for (int i = 0; i < list.size(); i++) {
// Palette.Swatch swatch = list.get(i);
// if (swatch != null) {
// int population = swatch.getPopulation();
// if (colorSize < population) {
// colorSize = population;
// maxSwatch = swatch;
// }
// }
// }
Palette.Swatch s = palette.getDominantSwatch();//独特的一种
Palette.Swatch s1 = palette.getVibrantSwatch(); //获取到充满活力的这种色调
Palette.Swatch s2 = palette.getDarkVibrantSwatch(); //获取充满活力的黑
Palette.Swatch s3 = palette.getLightVibrantSwatch(); //获取充满活力的亮
Palette.Swatch s4 = palette.getMutedSwatch(); //获取柔和的色调
Palette.Swatch s5 = palette.getDarkMutedSwatch(); //获取柔和的黑
Palette.Swatch s6 = palette.getLightMutedSwatch(); //获取柔和的亮
Palette.Swatch ss=s1;
if(ss==null)
ss=s;
if(ss==null)
ss=s2;
if(ss==null)
ss=s3;
if(ss==null)
ss=s4;
if(ss==null)
ss=s5;
if(ss==null)
ss=s6;
if (ss != null) {
view.setBackgroundColor(ss.getRgb());
}
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitEnd" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:scaleType="centerCrop" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/tv_time"
android:layout_marginBottom="4dp"
android:background="@color/transparent"
android:padding="2dp"
android:textColor="@color/black"
android:textSize="15sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/ll_title"
android:layout_marginBottom="5dp"
android:textColor="@color/white"
android:textSize="8sp" />
<LinearLayout
android:id="@+id/ll_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="13dp"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="bottom"
android:maxLines="2"
android:textColor="@color/white"
android:textSize="12sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment