A : 如何做到滚动并手动操控轮播?
B : 当然使用ViewPager了
A : 嗯 是这样的 ViewPager2就可以垂直了呀
博主: androidx 项目开发者请自行离开 ViewPager2的确可以实现
B : 项目使用的com.android.support:appcompat怎么办呢?
A :把整体项目升级到androidx
博主:的确是个好方法 未免忒费事了吧!!!后续会出一篇《如何升级androidx项目》
B :做为开发者 代码只要跑起来就不要乱动了 升级暂不采纳 会出现很多冲突!
A : ......
B : 那自定义一个垂直的 ViewPager
public class VerticalViewPager extends ViewPager{
public VerticalViewPager(Context context) {
this(context, null);
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
//设置viewpage的切换动画,真正实现垂直滑动的viewpager
setPageTransformer(true, new VerticalTransformer());
}
/**
* 拦截touch事件
*
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercept = super.onInterceptTouchEvent(swapEvent(ev));
swapEvent(ev);
return intercept;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapEvent(ev));
}
private MotionEvent swapEvent(MotionEvent event) {
//获取宽高
float width = getWidth();
float height = getHeight();
//将Y轴的移动距离转变成X轴的移动距离
float swappedX = (event.getY() / height) * width;
//将X轴的移动距离转变成Y轴的移动距离
float swappedY = (event.getX() / width) * height;
//重设event的位置
event.setLocation(swappedX, swappedY);
return event;
}
public classVerticalTransformer implements ViewPager.PageTransformer {
public static final String TAG = "classVerticalTransformer";
@Override
public void transformPage(View view, float position) {
float alpha = 0;
if (0 <= position && position <= 1) {
alpha = 1 - position;
} else if (-1 < position && position < 0) {
alpha = position + 1;
}
view.setAlpha(alpha);
float transX = view.getWidth() * -position;
view.setTranslationX(transX);
float transY = position * view.getHeight();
view.setTranslationY(transY);
}
}
}
A : 你小子真有你的真的可以垂直滚动了?那轮播呢?不能每次都手动吧!
B : ......(心中在咒骂)
博主 : 可以参考我之前的一篇自定义轮播 下方快捷入口
快捷入口
public class AutoTextViewPager extends FrameLayout {
public Context mContext;
public View inflate;
public VerticalViewPager pager;
private PagerAdapter adapter;
private boolean canAuto=true;
public ViewPager.OnPageChangeListener pageChangeListener;
public void setPageChangeListener(ViewPager.OnPageChangeListener pageChangeListener) {
this.pageChangeListener = pageChangeListener;
if (pager != null) {
pager.addOnPageChangeListener(pageChangeListener);
}
}
public boolean isCanAuto() {
return canAuto;
}
public void setCanAuto(boolean canAuto) {
this.canAuto = canAuto;
if (!canAuto){
stop();
}
}
AutoHandler mHandler;
public PagerAdapter getAdapter() {
return adapter;
}
public void setAdapter(PagerAdapter adapter) {
this.adapter = adapter;
pager.setAdapter(adapter);
}
public AutoTextViewPager(@NonNull Context context) {
this(context, null);
}
public AutoTextViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, -1);
}
public AutoTextViewPager(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inti(context, attrs, defStyleAttr);
}
private void inti(Context context, AttributeSet attrs, int defStyleAttr) {
mContext = context;
inflate = LayoutInflater.from(context).inflate(R.layout.auto_viewpager1, this, true);
pager = ((VerticalViewPager) inflate.findViewById(R.id.pager));
mHandler = new AutoHandler(pager);
if (canAuto) {
start();
}
pager.addOnPageChangeListener(pageChangeListener);
}
public void start(){
mHandler.start();
}
public void stop(){
mHandler.stop();
}
public interface PagerItemClickListener {
public void onItemClick(View view, int pos);
}
public abstract static class AutoAdapter<T> extends PagerAdapter implements OnClickListener,PagerItemClickListener {
private List<T> datas;
private Context context;
public abstract String getImageUrl(T data);
public abstract int getLayout();
public abstract void handleItem(View view, int pos);
@Override
public void onItemClick(View view, int pos) {
}
public AutoAdapter(Context context, List<T> datas) {
this.context = context;
this.datas = datas;
}
@Override
public int getCount() {
if (datas != null) {
return datas.size();
}
return 0;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
if (getLayout()>0) {
View inflate = LayoutInflater.from(context).inflate(getLayout(), null);
container.addView(inflate);
handleItem(inflate,position);
inflate.setTag(R.id.auto_id, position);
inflate.setOnClickListener(this);
return inflate;
}else {
ImageView img = new ImageView(context);
container.addView(img);
Glide.with(context).load(getImageUrl(datas.get(position)))
.apply(new RequestOptions().centerCrop())
.into(img);
img.setTag(R.id.auto_id, position);
img.setOnClickListener(this);
return img;
}
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(((View) object));
}
@Override
public void onClick(View v) {
int tag = (int) v.getTag(R.id.auto_id);
onItemClick(v,tag);
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.***.***.VerticalViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>
public class AutoHandler extends Handler {
public static int AUTO_TIME = 1000 * 5;
private ViewPager pager;
private boolean stopHandle;
public AutoHandler(ViewPager pager) {
this.pager = pager;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 100:
if (!stopHandle) {
sendEmptyMessageDelayed(100, AUTO_TIME);
int currentItem = pager.getCurrentItem() + 1;
if (currentItem >= pager.getAdapter().getCount()) {
currentItem = 0;
}
pager.setCurrentItem(currentItem);
}else {
removeMessages(100);
}
break;
default:
removeMessages(100);
break;
}
}
public void start(){
stopHandle=false;
if (!hasMessages(100)) {
sendEmptyMessageDelayed(100, AutoHandler.AUTO_TIME);
}
}
public void stop(){
stopHandle=true;
while (hasMessages(100)) {
removeMessages(100);
}
}
}
博主 : 到这就可以实现垂直轮播并手动控制了 就不配图了 大家自己试试看吧
博主 : 觉得还不错记得给点个赞 评个论哦