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
- RecycleView实现Gallery画廊效果,中间放大两边缩小
- ViewPager实现Gallery的画廊效果 突显中间 虚化两边的界面
- RecycleView实现的Gallery画廊效果(图片制作成圆角)
- Android 首页实现放大缩小的画廊效果
- RecyclerView 实现gallery画廊效果
- RecyclerView 实现gallery画廊效果
- Android 图片浏览功能简单实现(画廊效果实现,支持放大缩小)
- 用gallery展示图片,实现中间图片稍大,两边较小的效果
- 自定义View 之利用ViewPager 实现画廊效果(滑动放大缩小)
- 基于ViewPager实现Gallery画廊效果
- 利用ViewPager实现画廊Gallery效果
- ViewPager+TimerTask实现Gallery画廊效果
- Gallery放大缩小
- Gallery画廊预览效果
- Gallery----自定义画廊效果
- Gallery 画廊效果
- Android gallery实现选中放大的效果
- Android gallery实现选中放大的效果
- 使用rsync+crontab每天定时备份数据库文件。
- iOS KVC和KVO简介
- java基础学习之反射 十六
- 对HashMap扩容的耗时的测试以及自己的理解
- git操作
- RecycleView实现Gallery画廊效果,中间放大两边缩小
- OC--NSMutableArray可变数组
- EntityFramework 事务处理
- JDBC知识概括(2)
- python pandas.read_csv参数详解
- [luoguP3674]小清新人渣的本愿
- java 使用jacod操作word
- liferay 6.2 站点内容发布与ueditor的集成- ueditor-hook
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新