RecycleView实现Gallery画廊效果,中间放大两边缩小

来源:互联网 发布:淘宝店铺介绍在哪里看 编辑:程序博客网 时间:2024/05/01 07:55

   

 通过给RecycleView设置滚动监听,在 onScrolled 中完成功能。

    具体的算法是:

1.规定缩放比例的最大值和最小值 MAX_SCALE(eg: 1.2f) 和 MIN_SCALE(eg:0.85f)

2.当滑动的时候,计算recycleview的所有可用的子view的左边界(left = View.getLeft())和右边界(left = View.getRight())的距离比例 percent = left <0|| right <0?0: Math.min(left, right) *1f/ Math.max(left, right);

3.计算每个子view的缩放比例:floatscaleFactor =MIN_SCALE+ Math.abs(percent) * (MAX_SCALE-MIN_SCALE);

child.setScaleY(scaleFactor);

具体代码如下:


ScrollingActivity.class

public class ScrollingActivity extends AppCompatActivity {    private RecyclerView mRecycleView;    private RecyclerView.Adapter mAdapter;    private int mScreenWidth;    private static final float MIN_SCALE = .95f;    private static final float MAX_SCALE = 1.15f;    private LinearLayoutManager mLinearLayoutManager;    private int mMinWidth;    private int mMaxWidth;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_scrolling);        mRecycleView = (RecyclerView) findViewById(R.id.rv);        mLinearLayoutManager = new LinearLayoutManager(this);        mLinearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);        mRecycleView.setLayoutManager(mLinearLayoutManager);        mScreenWidth = getResources().getDisplayMetrics().widthPixels;        mMinWidth = (int) (mScreenWidth * 0.28f);        mMaxWidth = mScreenWidth - 2 * mMinWidth;        String[] names = new String[100];        for (int i = 0; i < names.length; i++) {            names[i] = "name -" + (i + 1);        }        mAdapter = new MyAdapter(names);        mRecycleView.setAdapter(mAdapter);        mRecycleView.addOnScrollListener(mOnScrollListener);    }    private RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {        @Override        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {            final int childCount = recyclerView.getChildCount();            Log.e("tag", childCount + "");            for (int i = 0; i < childCount; i++) {                RelativeLayout child = (RelativeLayout) recyclerView.getChildAt(i);                RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) child.getLayoutParams();                lp.rightMargin = 5;                lp.height = 200;                int left = child.getLeft();                int right = mScreenWidth - child.getRight();                final float percent = left < 0 || right < 0 ? 0 : Math.min(left, right) * 1f / Math.max(left, right);                Log.e("tag", "percent = " + percent);                float scaleFactor = MIN_SCALE + Math.abs(percent) * (MAX_SCALE - MIN_SCALE);                int width = (int) (mMinWidth + Math.abs(percent) * (mMaxWidth - mMinWidth));                lp.width = width;                child.setLayoutParams(lp);                child.setScaleY(scaleFactor);                if (percent > 1f / 3) {                    ((TextView) child.getChildAt(1)).setTextColor(Color.BLUE);                } else {                    ((TextView) child.getChildAt(1)).setTextColor(Color.BLACK);                }            }        }    };    private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {        private String[] mDatas;        public MyAdapter(String[] mDatas) {            this.mDatas = mDatas;        }        @Override        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            View view = LayoutInflater.from(ScrollingActivity.this).inflate(R.layout.item_list, null);            return new RecyclerView.ViewHolder(view) {            };        }        @Override        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {            Log.e("tuanhui", "bind view");            ImageView iv = (ImageView) holder.itemView.findViewById(R.id.iv_pic);            TextView tv = (TextView) holder.itemView.findViewById(R.id.tv_title);            iv.setImageResource(R.drawable.pic);            tv.setText(mDatas[position]);        }        @Override        public int getItemCount() {            return mDatas.length;        }    }}



activity_scrolling.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:clipChildren="false"    tools:context=".ScrollingActivity">    <RelativeLayout        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="50dp"        android:background="@color/colorPrimary">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="画廊"            android:textColor="#fff"            android:textSize="24sp"/>    </RelativeLayout>    <android.support.v7.widget.RecyclerView        android:id="@+id/rv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:clipChildren="false"        ></android.support.v7.widget.RecyclerView></RelativeLayout>
item_list.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:clipChildren="false"    android:orientation="vertical">    <ImageView        android:id="@+id/iv_pic"        android:layout_width="200dp"        android:layout_height="150dp"        android:layout_centerHorizontal="true"        android:scaleType="fitXY"        android:src="@mipmap/ic_launcher"        />    <TextView        android:id="@+id/tv_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/iv_pic"        android:layout_centerHorizontal="true"        android:layout_marginTop="10dp"        android:textColor="#323232"        android:textSize="16sp"/></RelativeLayout>



具体实现就这样了



0 0
原创粉丝点击