视差效果实现
来源:互联网 发布:数据库误删除没备份 编辑:程序博客网 时间:2024/06/07 18:25
视差效果实现效果图
1.先上效果图 源码当前使用的ReycleView当然也有使用listview版本的
使用ReycleView版本 使用ListView版本
首先是自定义的两个view代码如下:
ParallaxRecycleView
package com.cock.parallaxrecyclerview.view;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.util.AttributeSet;import com.cock.parallaxrecyclerview.holder.ParallaxViewHolder;/** * Author : Created by Luhailiang on 2016/8/29 12:11. * Email : 2842553747@qq.com */public class ParallaxRecyclerView extends RecyclerView { private OnScrollListener scrollListener; public ParallaxRecyclerView(Context context) { super(context); init(); } public ParallaxRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ParallaxRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { setOnScrollListener(defaultListener); } private OnScrollListener defaultListener = new OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (scrollListener != null) scrollListener.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); for (int i = 0; i < recyclerView.getChildCount(); i++) { ((ParallaxViewHolder) recyclerView.getChildViewHolder(recyclerView.getChildAt(i))).animateImage(); } if (scrollListener != null) scrollListener.onScrolled(recyclerView, dx, dy); } }; @Override public void setOnScrollListener(OnScrollListener listener) { if (listener != defaultListener) this.scrollListener = listener; else super.setOnScrollListener(listener); }}ParallaxImageView
package com.cock.parallaxrecyclerview.view;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.util.AttributeSet;import com.cock.parallaxrecyclerview.holder.ParallaxViewHolder;/** * Author : Created by Luhailiang on 2016/8/29 12:11. * Email : 2842553747@qq.com */public class ParallaxRecyclerView extends RecyclerView { private OnScrollListener scrollListener; public ParallaxRecyclerView(Context context) { super(context); init(); } public ParallaxRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ParallaxRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { setOnScrollListener(defaultListener); } private OnScrollListener defaultListener = new OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (scrollListener != null) scrollListener.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); for (int i = 0; i < recyclerView.getChildCount(); i++) { ((ParallaxViewHolder) recyclerView.getChildViewHolder(recyclerView.getChildAt(i))).animateImage(); } if (scrollListener != null) scrollListener.onScrolled(recyclerView, dx, dy); } }; @Override public void setOnScrollListener(OnScrollListener listener) { if (listener != defaultListener) this.scrollListener = listener; else super.setOnScrollListener(listener); }}
然后创建Adapter和ViewHolder
package com.cock.parallaxrecyclerview.holder;import android.support.v7.widget.RecyclerView;import android.view.View;import com.cock.parallaxrecyclerview.view.ParallaxImageView;/** * Author : Created by Luhailiang on 2016/8/29 12:14. * Email : 2842553747@qq.com */public abstract class ParallaxViewHolder extends RecyclerView.ViewHolder implements ParallaxImageView.ParallaxImageListener { private ParallaxImageView backgroundImage; public abstract int getParallaxImageId(); public ParallaxViewHolder(View itemView) { super(itemView); backgroundImage = (ParallaxImageView) itemView.findViewById(getParallaxImageId()); backgroundImage.setListener(this); } @Override public int[] requireValuesForTranslate() { if (itemView.getParent() == null) { // Not added to parent yet! return null; } else { int[] itemPosition = new int[2]; itemView.getLocationOnScreen(itemPosition); int[] recyclerPosition = new int[2]; ((RecyclerView) itemView.getParent()).getLocationOnScreen(recyclerPosition); return new int[]{itemView.getMeasuredHeight(), itemPosition[1], ((RecyclerView) itemView.getParent()).getMeasuredHeight(), recyclerPosition[1]}; } } public void animateImage() { getBackgroundImage().doTranslate(); } public ParallaxImageView getBackgroundImage() { return backgroundImage; }}
package com.cock.parallaxrecyclerview.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import com.cock.parallaxrecyclerview.R;import com.cock.parallaxrecyclerview.holder.ParallaxViewHolder;import com.squareup.picasso.Picasso;import java.util.ArrayList;/** * Author : Created by Luhailiang on 2016/8/29 12:22. * Email : 2842553747@qq.com */public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> { private Context context; private LayoutInflater inflater; private int getItemLayoutId ; private ArrayList<Integer> mData; public MyRecyclerAdapter(Context context, int getItemLayoutId, ArrayList<Integer> mData) { this.context = context; this.inflater = LayoutInflater.from(context); this.getItemLayoutId = getItemLayoutId; this.mData = mData; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) { return new ViewHolder(inflater.inflate(getItemLayoutId, viewGroup, false)); } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { Picasso.with(context).load(mData.get(position)).into(viewHolder.getBackgroundImage()); viewHolder.getTextView().setText("测试数据第" + position); // Important to call this method viewHolder.getBackgroundImage().reuse(); } @Override public int getItemCount() { return mData.size(); } /** * # CAUTION: * ViewHolder must extend from ParallaxViewHolder */ public static class ViewHolder extends ParallaxViewHolder { private final TextView textView; public ViewHolder(View v) { super(v); textView = (TextView) v.findViewById(R.id.label); } @Override public int getParallaxImageId() { return R.id.backgroundImage; } public TextView getTextView() { return textView; } }}最后在MainActivity中调用
package com.cock.parallaxrecyclerview.activity;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import com.cock.parallaxrecyclerview.R;import com.cock.parallaxrecyclerview.adapter.MyRecyclerAdapter;import com.cock.parallaxrecyclerview.view.ParallaxRecyclerView;import java.util.ArrayList;/** * Author : Created by Luhailiang on 2016/8/29 12:22. * Email : 2842553747@qq.com */public class MainActivity extends AppCompatActivity { private ArrayList<Integer> list = new ArrayList<Integer>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); ParallaxRecyclerView recyclerView = (ParallaxRecyclerView) findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setHasFixedSize(true); recyclerView.setAdapter(new MyRecyclerAdapter(this, R.layout.item, list)); } private void initData() { for (int i = 0; i < 20; i++) { list.add(R.mipmap.image1); list.add(R.mipmap.image2); list.add(R.mipmap.image3); list.add(R.mipmap.image4); list.add(R.mipmap.image5); } }}
0 0
- 视差效果实现
- jquery实现的视差滚动教程(视差大背景效果)
- 一种实现视差效果的思路
- 页面滚动视差效果的实现
- Android头部视差效果的实现方式
- 视差效果的引导界面实现
- ListView的头部视差效果的实现
- 应用background-position实现css视差效果
- 视差效果
- 视差滚动(Parallax Scrolling)效果的原理和实现
- [Cocos2d-x]视差滚屏效果的实现
- 视差滚动(Parallax Scrolling)效果的原理和实现
- 视差滚动(Parallax Scrolling)效果的原理和实现
- 实现知乎 Android 客户端启动页视差滚动效果
- 利用CSS固定背景交替实现视差滚动效果
- 实现知乎 Android 客户端启动页视差滚动效果
- OCiOS动效设计:UITableView 实现滚动视差效果
- ViewPager+属性动画 实现炫酷视差动画效果
- Java StringBuffer和StringBuilder的区别
- php字符串转与整数比较,会把字符串转化为整数来比较
- Android Application的作用
- 【安卓学习之代码学习】 双卡知识学习
- PAT_乙级 1030 完美数列
- 视差效果实现
- Linearization of the kernel functions in SVM
- 第7章 Spring Boot的Web开发2
- mysql 有索引没走索引 更新锁全表
- Asp.net post 实例
- 绝了,我想起来了不启动流程取得第一任务的下一环节
- java 复习——数据类型
- 深入理解JavaScript系地址
- iOS--屏幕尺寸