public class GroupTopicRecyclerView extends RecyclerView {
private static final String TAG = "MyRecyclerView";
private LinearLayoutManager mLayoutManager;
private int mTouchSlop;
private View zoomView;
// 记录首次按下位置
private float mFirstPosition = 0;
// 是否正在放大
private Boolean mScaling = false;
LinearLayoutManager mLinearLayoutManager;
private int screenWidth;
public GroupTopicRecyclerView(Context context) {
this(context, null);
}
public GroupTopicRecyclerView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public GroupTopicRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mLayoutManager = new LinearLayoutManager(context);
setLayoutManager(mLayoutManager);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
public void setZoomView(View v, LinearLayoutManager linearLayoutManager) {
//TODO获取屏幕宽度
DisplayMetrics metrics = new DisplayMetrics();
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
// System.out.println("宽度是 = " + screenWidth);
//此处我的图片命名为img,大家根据实际情况修改
SimpleDraweeView img = v.findViewById(R.id.details_one_titleimg);
RelativeLayout re = v.findViewById(R.id.details_one_background);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) img.getLayoutParams();
//获取屏幕宽度
lp.width = screenWidth;
//设置宽高比为16:9
lp.height = screenWidth * 14 / 25;
//给imageView重新设置宽高属性
img.setLayoutParams(lp);
re.setLayoutParams(lp);
this.zoomView = img;
mLinearLayoutManager = linearLayoutManager;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (zoomView != null) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) zoomView.getLayoutParams();
//判断触摸事件
switch (event.getAction()) {
//触摸结束
case MotionEvent.ACTION_UP:
mScaling = false;
replyImage();
break;
//触摸中
case MotionEvent.ACTION_MOVE:
//判断是否正在放大 mScaling 的默认值为false
if (!mScaling) {
//当图片也就是第一个item完全可见的时候,记录触摸屏幕的位置
if (mLinearLayoutManager.findViewByPosition(mLinearLayoutManager.findFirstVisibleItemPosition()).getTop() == 0) {
//记录首次按下位置
mFirstPosition = event.getY();
} else {
break;
}
}
// 滚动距离乘以一个系数
int distance = (int) ((event.getY() - mFirstPosition) * 0.4);
if (distance < 0) {
break;
}
// 处理放大
mScaling = true;
//----------lp.width = zoomView.getWidth() + distance;
lp.height = (zoomView.getWidth() + distance) * 14 / 25;
//System.out.println("宽度是 = " + lp.width + "高度是" + lp.height);
// 设置控件水平居中(如果不设置,图片的放大缩小是从图片顶点开始)
((MarginLayoutParams) lp).setMargins(-(lp.width - screenWidth) / 2, 0, 0, 0);
zoomView.setLayoutParams(lp);
return true; // 返回true表示已经完成触摸事件,不再处理
}
}
return super.onTouchEvent(event);
}
/**
* 图片回弹动画
*/
private void replyImage() {
final RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) zoomView.getLayoutParams();
final float wPresent = zoomView.getLayoutParams().width;// 图片当前宽度
final float hPresent = zoomView.getLayoutParams().height;// 图片当前高度
final float width = screenWidth;// 图片原宽度
final float heigh = screenWidth * 14 / 25;// 图片原高度
// 设置动画
ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration(200);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float cVal = (Float) animation.getAnimatedValue();
lp.width = (int) (wPresent - (wPresent - width) * cVal);
lp.height = (int) (hPresent - (hPresent - heigh) * cVal);
((MarginLayoutParams) lp).setMargins(-(lp.width - screenWidth) / 2, 0, 0, 0);
zoomView.setLayoutParams(lp);
}
});
anim.start();
}
}
使用方法Activity
//创建适配器,设置布局管理器
cardDetailsAdapter = new CardDetailsAdapter(this, list);
linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
card_details_recy.setLayoutManager(linearLayoutManager);
// //添加Android自带的分割线
// card_details_recy.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
//添加头布局
View view = getLayoutInflater().inflate(R.layout.carddetails_item_one_layout, (ViewGroup) card_details_recy.getParent(), false);
cardDetailsAdapter.addHeadView(view);
card_details_recy.setAdapter(cardDetailsAdapter);
card_details_recy.setZoomView(view , linearLayoutManager);
适配器与普通适配器一样
package com.example.liuhuan.first.function.adapter;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.example.liuhuan.first.R;
import com.example.liuhuan.first.function.bean.CardDetailsBean;
import com.example.liuhuan.first.function.bean.DemoItemBean;
import com.example.liuhuan.first.view.ShangshabanChangeTextSpaceView;
import com.facebook.drawee.view.SimpleDraweeView;
import java.text.DecimalFormat;
import java.util.List;
/**
* 卡片详情适配器
*/
public class CardDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private int ITEMONE = 0;//头部布局
private int ITEMTWO = 1;//条目布局
public static final int MSG_MEMBER = 1;//成员
public static final int MSG_JOIN = 2;//加入
public static final int MSG_TOPIC_ITEM = 3;//话题
private Context context;
private List<DemoItemBean> list;
private CardCallBack cardCallBack;
private View headView;
public CardDetailsAdapter(Context context, List<DemoItemBean> list) {
this.context = context;
this.list = list;
}
public interface CardCallBack {
void onCardCallBack(Message msg);
}
public void addHeadView(View headView) {
this.headView = headView;
}
public void setCardCallBack(CardCallBack cardCallBack) {
this.cardCallBack = cardCallBack;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
if (viewType == ITEMONE) {//条目一
//View view = View.inflate(context, R.layout.carddetails_item_one_layout, null);
return new DetailsOneHolder(headView);
} else if (viewType == ITEMTWO) {//条目二
View view = View.inflate(context, R.layout.carddetails_item_two_item, null);
return new CardDetailsItemHolder(view);
}
return null;
}
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder myHolder, final int position) {
if (myHolder instanceof DetailsOneHolder) {
String data = (String) list.get(position).getData();
DetailsOneHolder myHolderOne = (DetailsOneHolder) myHolder;
//绑定数据
myHolderOne.details_one_people.setText("9999个成员");
myHolderOne.details_one_title.setText(data);
myHolderOne.details_one_title.setSpacing(50);
myHolderOne.details_one_text.setText("谁没点烦心事,说出来大家哄哄你");
myHolderOne.details_one_titleimg.setImageURI("https://img-blog.csdnimg.cn/20181225095119964.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NzZG5uZXdz,size_16,color_FFFFFF,t_70");
myHolderOne.details_one_join.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message obtain = Message.obtain();
obtain.what = MSG_JOIN;
cardCallBack.onCardCallBack(obtain);
}
});
myHolderOne.details_one_people.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message obtain = Message.obtain();
obtain.what = MSG_MEMBER;
cardCallBack.onCardCallBack(obtain);
}
});
} else if (myHolder instanceof CardDetailsItemHolder) { //设置其他不同条目
CardDetailsItemHolder myHolderTwo = (CardDetailsItemHolder) myHolder;
CardDetailsBean cardDetailsDataBean = (CardDetailsBean) list.get(position).getData();
//绑定数据
myHolderTwo.details_two_item_detailsText.setText(cardDetailsDataBean.getDetailsText());
myHolderTwo.details_two_item_time.setText(position + "分钟前");
myHolderTwo.details_two_item_who.setText(cardDetailsDataBean.getWho());
myHolderTwo.details_two_item_detailsimg.setImageURI(Uri.parse("http://h.hiphotos.baidu.com/zhidao/pic/item/2f738bd4b31c87018e126740237f9e2f0608fff4.jpg"));
myHolderTwo.details_two_item_titleimg.setImageURI(Uri.parse("http://h.hiphotos.baidu.com/zhidao/pic/item/2f738bd4b31c87018e126740237f9e2f0608fff4.jpg"));
//根据热度动态替换背景图片
if (cardDetailsDataBean.getHot()<20){
myHolderTwo.details_two_item_hot.setText(cardDetailsDataBean.getHot() + "");
myHolderTwo.details_two_item_hot.setBackground(context.getResources().getDrawable(R.drawable.comment_low));
}else if (cardDetailsDataBean.getHot()>=20 && cardDetailsDataBean.getHot()<1000){
myHolderTwo.details_two_item_hot.setText(cardDetailsDataBean.getHot() + "");
myHolderTwo.details_two_item_hot.setBackground(context.getResources().getDrawable(R.drawable.comment_hot_middle));
}else if (cardDetailsDataBean.getHot()>=1000 && cardDetailsDataBean.getHot()<10000){
float hotNums =cardDetailsDataBean.getHot()/1000f;
DecimalFormat df = new DecimalFormat("#.0");//格式化小数
myHolderTwo.details_two_item_hot.setText(df.format(hotNums) + "k");
myHolderTwo.details_two_item_hot.setBackground(context.getResources().getDrawable(R.drawable.comment_hot_high));
}else if (cardDetailsDataBean.getHot()>=10000 && cardDetailsDataBean.getHot()<100000){
float hotNums =cardDetailsDataBean.getHot()/10000f;
DecimalFormat df = new DecimalFormat("#.0");//格式化小数
myHolderTwo.details_two_item_hot.setText(df.format(hotNums) + "w");
myHolderTwo.details_two_item_hot.setBackground(context.getResources().getDrawable(R.drawable.comment_hot_high));
}
if (position % 2 == 0) {
myHolderTwo.details_two_item_detailsimg.setVisibility(View.VISIBLE);
} else {
myHolderTwo.details_two_item_detailsimg.setVisibility(View.GONE);
}
myHolderTwo.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message obtain = Message.obtain();
obtain.what = MSG_TOPIC_ITEM;
cardCallBack.onCardCallBack(obtain);
}
});
}
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
@Override
public int getItemViewType(int position) {
if (list.get(position).getItemType() == DemoItemBean.TYPE_DETAILS_TITLE) {
return ITEMONE;
} else if (list.get(position).getItemType() == DemoItemBean.TYPE_DETAILS_ITEM) {
return ITEMTWO;
}
return -1;
}
class DetailsOneHolder extends RecyclerView.ViewHolder {
private final RelativeLayout details_one_background;
private final ShangshabanChangeTextSpaceView details_one_title;
private final TextView details_one_people;
private final TextView details_one_text;
private final Button details_one_join;
private final SimpleDraweeView details_one_titleimg;
public DetailsOneHolder(@NonNull View itemView) {
super(itemView);
details_one_background = itemView.findViewById(R.id.details_one_background);
details_one_title = itemView.findViewById(R.id.details_one_title);
details_one_people = itemView.findViewById(R.id.details_one_people);
details_one_text = itemView.findViewById(R.id.details_one_text);
details_one_join = itemView.findViewById(R.id.details_one_join);
details_one_titleimg = itemView.findViewById(R.id.details_one_titleimg);
}
}
class CardDetailsItemHolder extends RecyclerView.ViewHolder {
private final TextView details_two_item_hot;
private final TextView details_two_item_detailsText;
private final TextView details_two_item_who;
private final TextView details_two_item_time;
private final SimpleDraweeView details_two_item_titleimg;
private final SimpleDraweeView details_two_item_detailsimg;
public CardDetailsItemHolder(@NonNull View itemView) {
super(itemView);
details_two_item_hot = itemView.findViewById(R.id.details_two_item_hot);
details_two_item_detailsText = itemView.findViewById(R.id.details_two_item_detailsText);
details_two_item_titleimg = itemView.findViewById(R.id.details_two_item_titleimg);
details_two_item_who = itemView.findViewById(R.id.details_two_item_who);
details_two_item_time = itemView.findViewById(R.id.details_two_item_time);
details_two_item_detailsimg = itemView.findViewById(R.id.details_two_item_detailsimg);
}
}
}