在用ViewPager配合Fragment开发的模式中,想做一个类似于桌面壁纸的背景图,可以跟着ViewPager滑动。这里贴一下项目初期实现了的效果:
可以看到,界面中ViewPager滑动的同时背景图片也跟着滑动了,二者的滑动速率不一样。那么来
大体思路:
在ViewPager滑动的过程中,监听滑动百分比,再通过这个滑动的百分比来控制背景图的偏移,背景图的偏移通过背景图的尺寸和View容器的尺寸来计算。最后将这个偏移后的图片显示在ImageView或者某个View的Drawable上。(其实SurfaceView的性能会强得多,但是SurfaceView没有View属性,而且放在布局中还会让其他View的显示出现一些问题,特别是有半透明,阴影这些地方)
那么接下来就开始吧,首先准备好一张背景图片,一个ViewPager,作者用的是VIewPager2。
这里先放一个简单的一个ViewPager2。
ViewPagerAdapter.java
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.jetbrains.annotations.NotNull;
/**
* @author ldh
* 时间: 2021/10/23 13:51
* 邮箱: 2637614077@qq.com
*/
public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.MyViewHolder> {
int maxCount = 0;
public ViewPagerAdapter(int maxCount){
this.maxCount = maxCount;
}
@NonNull
@NotNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_viewpager, parent, false));
}
@Override
public void onBindViewHolder(@NonNull @NotNull MyViewHolder holder, int position) {
holder.textView.setText("这是第" + (position + 1) + "页");
}
@Override
public int getItemCount() {
return maxCount;
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.item_viewpager_textview);
}
}
}
MainActivity.kt
val viewpager2 = findViewById<ViewPager2>(R.id.viewpager2)
viewpager2.adapter = ViewPagerAdapter(4)
现在是这个效果,此时只是简单的完成了一个ViewPager。
然后我们写一个工具类,用偏移比率来描述偏移量。
偏移比率:[0,1]之间,初始为0,0表示还没开始划,1就是已经划完了。因为图片的尺寸和view的尺寸是可能会随着需求动态变化的,所以只记录偏移的比例。
ImageScroller.kt
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
i