ViewPager 滑动时速度太慢
ViewPager is Too Slow While is Swiping
我正在尝试用 Java 在 Android 上做我自己的滑块。
在问这个问题之前,我做了很多研究,但我找不到任何解决办法。
我的 ViewPager 在 API 21 上滑动时太慢了,但在 API 23 或更高版本上很好。
这些但是我没能成功:
- 我试过 viewPager.setOffscreenPageLimit(0);
- 我试过调整图片大小。
- 我曾尝试使用 Glide,但后来转回 setImageResource。
- 3.1 我试过了DiskCacheStrategy.ALL
- 我尝试使用 RecyclerView 而不是 ViewPager,但同样的滚动卡住了。
- 4.1 我试过了 recyclerView.setHasFixedFixedSize(true);
- 4.2 我没有在onBindViewHolder
中做任何处理
- 即使我没有将任何图像放入 ImageView 仍然继续。
你可以在下面看到我的代码。
Activity:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_timeline);
//Slider Process
ViewPager slider = findViewById(R.id.vpSlider);
ViewPagerIndicator pagerIndicator = findViewById(R.id.vpiTimeline);
SliderAdapter sliderAdapter = new SliderAdapter(slider.getContext(),listSliderUrl());
slider.setAdapter(sliderAdapter);
slider.setOffscreenPageLimit(10);
pagerIndicator.setupWithViewPager(slider);
ViewPager 适配器:
public class SliderAdapter extends PagerAdapter {
private Context context;
private List<Integer> urls;
private LayoutInflater inflater;
public SliderAdapter(Context context, List<Integer> urls) {
this.context = context;
this.urls = urls;
}
@Override
public int getCount() {
return urls.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return (View)object == view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
inflater =
(LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
// View view = LayoutInflater.from(context).inflate(R.layout.item_slider,container,false);
View view = inflater.inflate(R.layout.item_slider,container,false);
ImageView iv = view.findViewById(R.id.ivSlider);
// GlideApp.with(context).load(urls.get(position)).diskCacheStrategy(DiskCacheStrategy.ALL).into(iv);
iv.setImageResource(urls.get(position));
container.addView(view);
return view;
}
}
回收器视图适配器:
public class RecyclerViewSliderAdapter extends RecyclerView.Adapter {
Context context;
List<Integer> urls;
public RecyclerViewSliderAdapter(Context context, List<Integer> urls) {
this.context = context;
this.urls = urls;
}
@NonNull
@Override
public ViewHolderSlider onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_slider,parent,false);
ViewHolderSlider viewHolderSlider = new ViewHolderSlider(layoutView);
return viewHolderSlider;
}
@Override
public void onBindViewHolder(@NonNull ViewHolderSlider holder, int position) {
holder.bindData(urls.get(position));
}
@Override
public int getItemCount() {
return urls.size();
}
}
class ViewHolderSlider extends RecyclerView.ViewHolder{
ImageView ivSlider;
public ViewHolderSlider(View itemView) {
super(itemView);
ivSlider = (ImageView)itemView.findViewById(R.id.ivSlider);
}
public void bindData(final Integer url){
ivSlider.setImageResource(url);
}}
//这是我的item_slider.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/ivSlider"
android:layout_width="match_parent" android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent" android:layout_margin="0dp"/>
<ImageView
android:id="@+id/ivGradient"
android:layout_width="match_parent"
android:layout_height="111dp"
android:layout_margin="0dp"
android:src="@mipmap/gradient"
android:scaleType="fitXY"
app:layout_constraintBottom_toBottomOf="@id/ivSlider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tvSliderHeader"
android:layout_width="match_parent"
android:fontFamily="@font/opensans_light"
android:textSize="11sp"
android:textColor="@color/yellow"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@id/tvSliderTitle"
android:layout_marginBottom="7dp"
android:layout_marginStart="32dp"
android:text="@string/dunya" />
<TextView
android:id="@+id/tvSliderTitle"
android:textSize="24sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="@id/ivSlider"
android:layout_marginBottom="26dp"
android:layout_marginStart="31dp"
android:textColor="@color/white"
android:textStyle="bold"
android:text="TÜRKİYE'YE KARŞI\nHİSLERİM DEĞİŞTİ" />
</android.support.constraint.ConstraintLayout>
这实际上是内存泄漏,我在ConstraintLayout 中使用ViewPager,我将ConstraintLayout 更改为LinearLayout,问题解决了!如果你有这样的烦恼,就换个外部布局试试吧。
我正在尝试用 Java 在 Android 上做我自己的滑块。 在问这个问题之前,我做了很多研究,但我找不到任何解决办法。
我的 ViewPager 在 API 21 上滑动时太慢了,但在 API 23 或更高版本上很好。
这些但是我没能成功:
- 我试过 viewPager.setOffscreenPageLimit(0);
- 我试过调整图片大小。
- 我曾尝试使用 Glide,但后来转回 setImageResource。
- 3.1 我试过了DiskCacheStrategy.ALL
- 我尝试使用 RecyclerView 而不是 ViewPager,但同样的滚动卡住了。
- 4.1 我试过了 recyclerView.setHasFixedFixedSize(true);
- 4.2 我没有在onBindViewHolder 中做任何处理
- 即使我没有将任何图像放入 ImageView 仍然继续。 你可以在下面看到我的代码。
Activity:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_timeline);
//Slider Process
ViewPager slider = findViewById(R.id.vpSlider);
ViewPagerIndicator pagerIndicator = findViewById(R.id.vpiTimeline);
SliderAdapter sliderAdapter = new SliderAdapter(slider.getContext(),listSliderUrl());
slider.setAdapter(sliderAdapter);
slider.setOffscreenPageLimit(10);
pagerIndicator.setupWithViewPager(slider);
ViewPager 适配器:
public class SliderAdapter extends PagerAdapter {
private Context context;
private List<Integer> urls;
private LayoutInflater inflater;
public SliderAdapter(Context context, List<Integer> urls) {
this.context = context;
this.urls = urls;
}
@Override
public int getCount() {
return urls.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return (View)object == view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
inflater =
(LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
// View view = LayoutInflater.from(context).inflate(R.layout.item_slider,container,false);
View view = inflater.inflate(R.layout.item_slider,container,false);
ImageView iv = view.findViewById(R.id.ivSlider);
// GlideApp.with(context).load(urls.get(position)).diskCacheStrategy(DiskCacheStrategy.ALL).into(iv);
iv.setImageResource(urls.get(position));
container.addView(view);
return view;
}
}
回收器视图适配器:
public class RecyclerViewSliderAdapter extends RecyclerView.Adapter {Context context; List<Integer> urls; public RecyclerViewSliderAdapter(Context context, List<Integer> urls) { this.context = context; this.urls = urls; } @NonNull @Override public ViewHolderSlider onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_slider,parent,false); ViewHolderSlider viewHolderSlider = new ViewHolderSlider(layoutView); return viewHolderSlider; } @Override public void onBindViewHolder(@NonNull ViewHolderSlider holder, int position) { holder.bindData(urls.get(position)); } @Override public int getItemCount() { return urls.size(); }
}
class ViewHolderSlider extends RecyclerView.ViewHolder{ImageView ivSlider; public ViewHolderSlider(View itemView) { super(itemView); ivSlider = (ImageView)itemView.findViewById(R.id.ivSlider); } public void bindData(final Integer url){ ivSlider.setImageResource(url); }}
//这是我的item_slider.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <ImageView android:id="@+id/ivSlider" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" android:scaleType="centerCrop" app:layout_constraintBottom_toBottomOf="parent" android:layout_margin="0dp"/> <ImageView android:id="@+id/ivGradient" android:layout_width="match_parent" android:layout_height="111dp" android:layout_margin="0dp" android:src="@mipmap/gradient" android:scaleType="fitXY" app:layout_constraintBottom_toBottomOf="@id/ivSlider" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <TextView android:id="@+id/tvSliderHeader" android:layout_width="match_parent" android:fontFamily="@font/opensans_light" android:textSize="11sp" android:textColor="@color/yellow" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toTopOf="@id/tvSliderTitle" android:layout_marginBottom="7dp" android:layout_marginStart="32dp" android:text="@string/dunya" /> <TextView android:id="@+id/tvSliderTitle" android:textSize="24sp" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="@id/ivSlider" android:layout_marginBottom="26dp" android:layout_marginStart="31dp" android:textColor="@color/white" android:textStyle="bold" android:text="TÜRKİYE'YE KARŞI\nHİSLERİM DEĞİŞTİ" /> </android.support.constraint.ConstraintLayout>
这实际上是内存泄漏,我在ConstraintLayout 中使用ViewPager,我将ConstraintLayout 更改为LinearLayout,问题解决了!如果你有这样的烦恼,就换个外部布局试试吧。