- 本文使用了ViewPager(androidx.viewpager.widget.ViewPager)来实现轮播图的功能
一、思路
我们想要实现一个轮播图的功能,首先能想到的是使用ViewPager来实现。
- 就是使得ViewPager实现启动页来无限的轮播图片
- 启动一个定时器来完成自动的轮播效果。
二、代码布局
- 效果图
- 主界面布局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="wrap_content"
android:orientation="vertical"
android:clipChildren="false"
android:layerType="software"
tools:ignore="MissingDefaultResource,ResourceName">
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:layout_centerHorizontal="true"
android:layout_marginHorizontal="60dp"
android:layout_above="@+id/ll">
</androidx.viewpager.widget.ViewPager>
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginTop="10dp"
android:orientation="vertical"
android:visibility="visible">
<TextView
android:id="@+id/tv_filename"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="2dp"
android:text=""
android:textColor="@android:color/white" />
<LinearLayout
android:id="@+id/points"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
<RelativeLayout
android:id="@+id/ll_download"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.inroad.ui.widgets.InroadBtn_Medium
android:id="@+id/btn_download"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:layout_centerHorizontal="true"
android:gravity="center"
android:visibility="invisible"
android:text="@string/download_txt"/>
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
- 主dialog代码逻辑
private Context context;
private DisplayMetrics display;
private TextView fileName;
private LinearLayout linearLayout;
private InroadBtn_Medium btn_download;
private ViewPager viewPager;
private List<PanelFileBean> fileBeans;
//设置圆点View
private View view_point;
private LinearLayout.LayoutParams layoutParams;
//指示器标志位置
private int pointIndex = 0;
//自动轮播
private Handler mHandler = new Handler();
private int delayMillis = 5000;
@Override
public void setDialogType() {
isFullWidth = true;
heightOffset = 200;
widthOffset = 30;
}
public InroadViewpagerDialog builder() {
return this;
}
public InroadViewpagerDialog setPanelFileBean(List<PanelFileBean> panelFileBeans) {
this.fileBeans = panelFileBeans;
return this;
}
@Override
public void initDialogWidth(WindowManager.LayoutParams wl, DisplayMetrics dm) {
wl.width = (int) (dm.widthPixels * 1.0);
wl.height = (int) (dm.heightPixels * 0.6);
}
public InroadViewpagerDialog(Context context) {
this.context = context;
display = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(display);
}
@SuppressLint("MissingInflatedId")
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = LayoutInflater.from(context).inflate(R.layout.dialog_viewpager, null);
getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);
fileName = (TextView) view.findViewById(R.id.tv_filename);
linearLayout = (LinearLayout) view.findViewById(R.id.points);
viewPager = view.findViewById(R.id.viewpager);
btn_download = view.findViewById(R.id.btn_download);
RelativeLayout rl_download = view.findViewById(R.id.ll_download);
rl_download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (View.INVISIBLE == btn_download.getVisibility()) {
dismiss();
}
}
});
initViewData();
return view;
}
public void show() {
super.show(((AppCompatActivity) context).getSupportFragmentManager(), context.getClass().getSimpleName());
}
/**
* 初始化view,赋值
*/
private void initViewData() {
initBtnDownload();
for (PanelFileBean bean : fileBeans) { //设置圆点
view_point = new View(context);
layoutParams = new LinearLayout.LayoutParams(30, 30);
layoutParams.leftMargin = 20;
view_point.setBackgroundResource(R.drawable.point_selector);
view_point.setLayoutParams(layoutParams);
view_point.setEnabled(false);
view_point.setTag(bean);
linearLayout.addView(view_point);
}
linearLayout.getChildAt(pointIndex).setEnabled(true);
fileName.setText(fileBeans.get(pointIndex).datavaluetitle);
MeetingViewPagerAdapter meetingViewPagerAdapter = new MeetingViewPagerAdapter(context, fileBeans);
viewPager.setAdapter(meetingViewPagerAdapter);
viewPager.setPageTransformer(false, new ScaleTransformer());
viewPager.setPageMargin(10);
viewPager.setOffscreenPageLimit(fileBeans.size());
viewPager.setCurrentItem(pointIndex, true);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(final int position) {
int newPosition = position % fileBeans.size();
fileName.setText(fileBeans.get(newPosition).datavaluetitle);
linearLayout.getChildAt(pointIndex).setEnabled(false);
linearLayout.getChildAt(newPosition).setEnabled(true);
pointIndex = newPosition;
initBtnDownload();
}
@Override
public void onPageScrollStateChanged(int state) {
//当页面空闲状态被改变的时候
if (state == ViewPager.SCROLL_STATE_IDLE) {
mHandler.postDelayed(runnable, delayMillis);//延时,自动轮播
} else {
mHandler.removeCallbacks(runnable);//触摸页面,停止自动轮播
}
}
});
}
/**
* 下载按钮逻辑
*/
private void initBtnDownload() {
btn_download.setVisibility(View.INVISIBLE);
if (!fileBeans.get(pointIndex).datavalue.endsWith(".png")
&& !fileBeans.get(pointIndex).datavalue.endsWith(".jpg")
&& !fileBeans.get(pointIndex).datavalue.endsWith(".jpeg")) {
btn_download.setVisibility(View.VISIBLE);
}
btn_download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
downloadFile(fileBeans.get(pointIndex));
}
});
}
/**
* 文件下载
*
* @param bean
*/
private void downloadFile(PanelFileBean bean) {
//String suffix = FileUtils.getFileSuffix(fileBeans.get(newPosition).url); //获取扩展名
String suffix = "";
String fileName = FileUtils.getFileName(FileUtils.PATH_FILE, FileUtils.getStandardFileName(bean.datavaluetitle), suffix); //获取名称
DownloadUtils.DownloadFile(bean.datavalue, fileName, suffix, null);
}
/**
* 自动轮播图方法,实现无限轮播
*/
private final Runnable runnable = new Runnable() {
@Override
public void run() {
//获得轮播图当前的位置
int currentPosition = viewPager.getCurrentItem();
currentPosition++;
viewPager.setCurrentItem(currentPosition, true);
mHandler.postDelayed(runnable, delayMillis);
}
};
@Override
public void onResume() {
super.onResume();
mHandler.postDelayed(runnable, delayMillis);
}
@Override
public void onPause() {
super.onPause();
mHandler.removeCallbacks(runnable);
}
- 指示器布局代码-drawable
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:shape="oval" tools:ignore="ResourceName"> <corners android:radius="0.5dp" /> <solid android:color="#428EFF" /> </shape><?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:shape="oval" tools:ignore="ResourceName"> <corners android:radius="0.5dp" /> <solid android:color="#AAFFFFFF" /> </shape>
- 整合-实现效果布局代码
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:ignore="ResourceName"> <item android:drawable="@drawable/v_point_down" android:state_enabled="true" /> <item android:drawable="@drawable/v_point_up" android:state_enabled="false" /> </selector>
三、ViewPager的适配器
public class MeetingViewPagerAdapter extends PagerAdapter { private List<PanelFileBean> panelFileBeans; private Context context; private LayoutInflater inflater; public MeetingViewPagerAdapter(Context context, List<PanelFileBean> list) { this.context = context; this.panelFileBeans = list; inflater = LayoutInflater.from(context); } @Override public int getCount() { //return panelFileBeans.size(); return Integer.MAX_VALUE; // 无限轮播 } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, final int position) { View view = inflater.inflate(R.layout.item_viewpager, container, false); ImageView iv_open = (ImageView) view.findViewById(R.id.iv_open); iv_open.setVisibility(View.GONE); final int Position = position % panelFileBeans.size(); ImageView imageView = (ImageView) view.findViewById(R.id.iv); imageView.setEnabled(false); imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { InroadPictureDialog inroadPictureDialog = new InroadPictureDialog(context).builder(); inroadPictureDialog.setData(panelFileBeans.get(Position)); inroadPictureDialog.show(); } }); if (!TextUtils.isEmpty(panelFileBeans.get(Position).datavalue)) { String fileName = panelFileBeans.get(Position).datavalue.substring(panelFileBeans.get(Position).datavalue.lastIndexOf(".") + 1); switch (fileName) { case "png": case "jpg": case "jpeg": imageView.setEnabled(true); iv_open.setVisibility(View.VISIBLE); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); Glide.with(context).load(panelFileBeans.get(Position).datavalue).error(R.drawable.picture).placeholder(R.drawable.picture).into(imageView); break; case "mp4": case "flv": case "avi": imageView.setImageResource(R.drawable.file_vedio); break; case "mp3": imageView.setImageResource(R.drawable.file_mp3); break; case "doc": case "docx": imageView.setImageResource(R.drawable.file_word); break; case "ppt": case "pptx": imageView.setImageResource(R.drawable.file_ppt); break; case "xls": case "xlsx": imageView.setImageResource(R.drawable.file_excel); break; case "pdf": imageView.setImageResource(R.drawable.file_pdf); break; case "txt": imageView.setImageResource(R.drawable.file_txt); break; default: break; } } container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }
<?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="200dp" android:background="@color/inroad_expand_color" android:orientation="vertical" tools:ignore="ResourceName"> <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" /> <ImageView android:id="@+id/iv_open" android:layout_width="24dp" android:layout_height="24dp" android:layout_alignParentEnd="true" android:scaleType="centerCrop" android:src="@drawable/icon_vp_open" /> </RelativeLayout>
四、PageTransformer
public class ScaleTransformer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.85f; private static final float MIN_ALPHA = 0.5f; @Override public void transformPage(View page, float position) { if (position < -1 || position > 1) { page.setAlpha(MIN_ALPHA); page.setScaleX(MIN_SCALE); page.setScaleY(MIN_SCALE); } else if (position <= 1) { float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); float scaleX; if (position < 0) { scaleX = 1 + 0.15f * position; } else { scaleX = 1 - 0.15f * position; } page.setScaleX(scaleX); page.setScaleY(scaleX); page.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); } } }