揭示效果布局,可以指定2个子布局,以圆形揭示效果切换选中状态
- 在项目根目录的build.gradle添加仓库地址
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
- 在项目app目录的build.gradle添加依赖
从1.1.1版本开始,版本号前不加v,引用时需要注意。
dependencies {
implementation 'com.github.goweii:RevealLayout:1.1.1'
}
<per.goweii.reveallayout.RevealLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
app:rl_allow_revert="true"
app:rl_anim_duration="1000"
app:rl_check_with_expand="true"
app:rl_checked="false"
app:rl_checked_layout="@layout/reveal_layout_follow_checked"
app:rl_uncheck_with_expand="true"
app:rl_unchecked_layout="@layout/reveal_layout_follow_unchecked" />
revealLayout.setOnCheckedChangeListener(new RevealLayout.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RevealLayout revealLayout, boolean isChecked) {
// TODO
}
});
如一个关注取消关注控件FollowView,只需要继承RevealLayout,然后复写以下3个方法:
- initAttr(AttributeSet attrs):获取子类的自定义属性
- createCheckedView():创建选中状态视图,并初始化自定义属性
- createUncheckedView():创建非选中状态视图,并初始化自定义属性
public class FollowView extends RevealLayout{
private float mTvTextSize;
private int mTvPaddingVertical = 0;
private int mTvPaddingHorizontal = 0;
private String mTvUnFollowText = "";
private int mTvUnFollowBgColor;
private int mTvUnFollowBgRes;
private int mTvUnFollowTextColor;
private String mTvFollowText = "";
private int mTvFollowBgColor;
private int mTvFollowBgRes;
private int mTvFollowTextColor;
public FollowView(Context context) {
this(context, null);
}
public FollowView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FollowView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void initAttr(AttributeSet attrs) {
super.initAttr(attrs);
DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.FollowView);
mTvPaddingVertical = (int) array.getDimension(R.styleable.FollowView_fv_tv_padding_vertical, 0F);
mTvPaddingHorizontal = (int) array.getDimension(R.styleable.FollowView_fv_tv_padding_horizontal, 0F);
mTvTextSize = array.getDimension(R.styleable.FollowView_fv_text_size, metrics.scaledDensity * 14) / metrics.scaledDensity;
mTvUnFollowText = array.getString(R.styleable.FollowView_fv_unfollowed_text);
mTvUnFollowBgRes = array.getResourceId(R.styleable.FollowView_fv_unfollowed_bg_res, 0);
mTvUnFollowBgColor = array.getColor(R.styleable.FollowView_fv_unfollowed_bg_color, 0);
mTvUnFollowTextColor = array.getColor(R.styleable.FollowView_fv_unfollowed_text_color, 0);
mTvFollowText = array.getString(R.styleable.FollowView_fv_followed_text);
mTvFollowBgRes = array.getResourceId(R.styleable.FollowView_fv_followed_bg_res, 0);
mTvFollowBgColor = array.getColor(R.styleable.FollowView_fv_followed_bg_color, 0);
mTvFollowTextColor = array.getColor(R.styleable.FollowView_fv_followed_text_color, 0);
array.recycle();
}
@Override
protected View createCheckedView() {
TextView tvFollow = new TextView(getContext());
tvFollow.setTextSize(mTvTextSize);
tvFollow.setText(mTvFollowText);
tvFollow.setGravity(Gravity.CENTER);
tvFollow.setSingleLine();
if (mTvFollowBgRes > 0) {
tvFollow.setBackgroundResource(mTvFollowBgRes);
} else {
tvFollow.setBackgroundColor(mTvFollowBgColor);
}
tvFollow.setTextColor(mTvFollowTextColor);
tvFollow.setPadding(mTvPaddingHorizontal, mTvPaddingVertical, mTvPaddingHorizontal, mTvPaddingVertical);
return tvFollow;
}
@Override
protected View createUncheckedView() {
TextView tvUnFollow = new TextView(getContext());
tvUnFollow.setTextSize(mTvTextSize);
tvUnFollow.setText(mTvUnFollowText);
tvUnFollow.setGravity(Gravity.CENTER);
tvUnFollow.setSingleLine();
if (mTvUnFollowBgRes > 0) {
tvUnFollow.setBackgroundResource(mTvUnFollowBgRes);
} else {
tvUnFollow.setBackgroundColor(mTvUnFollowBgColor);
}
tvUnFollow.setTextColor(mTvUnFollowTextColor);
tvUnFollow.setPadding(mTvPaddingHorizontal, mTvPaddingVertical, mTvPaddingHorizontal, mTvPaddingVertical);
return tvUnFollow;
}
}