package com.bigfat.draggedviewpager.view;
import android.content.Context;
import android.content.res.Configuration;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.ScrollView;
import com.bigfat.draggedviewpager.R;
import com.bigfat.draggedviewpager.utils.DragUtils;
import com.bigfat.draggedviewpager.utils.MDA_DraggedViewPagerController;
import com.bigfat.draggedviewpager.utils.MDA_DraggedViewPagerListener;
import java.util.List;
/**
* Created by yueban on 10/7/15.
*/
public class MDA_DraggedViewPager extends HorizontalScrollView {
public static final String TAG = MDA_DraggedViewPager.class.getSimpleName();
private MDA_DraggedViewPagerListener draggedViewPagerListener;
//控件
private MDA_HorizontalLayout container;//布局控件
private MDA_DraggedViewPagerController controller;
private int currentPage = 0;//当前页Index
private int pageSwitchOffsetX;//触发页面切换的X轴偏移量
private int pageSwitchSpeed;//触发页面切换的速度
private float touchStartX;//触摸起始X坐标
private long touchStartTime;//触摸起始时间
public MDA_DraggedViewPager(Context context) {
this(context, null);
}
public MDA_DraggedViewPager(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MDA_DraggedViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
initMeasure();
pageSwitchOffsetX = getResources().getDimensionPixelSize(R.dimen.page_switch_offset_x);
pageSwitchSpeed = getResources().getDimensionPixelSize(R.dimen.page_switch_speed);
setHorizontalScrollBarEnabled(false);
setOverScrollMode(OVER_SCROLL_NEVER);
container = new MDA_HorizontalLayout(getContext());
addView(container);
}
private void initMeasure() {
DragUtils.screenWidth = getResources().getDisplayMetrics().widthPixels;
DragUtils.screenHeight = getResources().getDisplayMetrics().heightPixels;
DragUtils.pageEdgeVisibleWidth = getResources().getDimensionPixelOffset(R.dimen.page_edge_visible_width);
DragUtils.pageMargin = getResources().getDimensionPixelOffset(R.dimen.page_margin);
DragUtils.pageScrollWidth = DragUtils.screenWidth - DragUtils.pageMargin * 2 - DragUtils.pageEdgeVisibleWidth * 2;
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
initMeasure();
}
public List getData() {
return controller.getData();
}
public MDA_DraggedViewPagerController getController() {
return controller;
}
public void setController(MDA_DraggedViewPagerController controller) {
this.controller = controller;
controller.setDraggedViewPager(this);
notifyDataSetChanged();
}
public void setDraggedViewPagerListener(MDA_DraggedViewPagerListener draggedViewPagerListener) {
this.draggedViewPagerListener = draggedViewPagerListener;
}
/**
* 设置页面交换响应延迟
*
* @param pageSwapDelay 响应值(ms),默认300ms
*/
public void setPageSwapDelay(int pageSwapDelay) {
DragUtils.pageSwapDelay = pageSwapDelay;
}
/**
* 设置item移动响应延迟
*
* @param itemMoveDelay 响应值(ms),默认300ms
*/
public void setItemMoveDelay(int itemMoveDelay) {
DragUtils.itemMoveDelay = itemMoveDelay;
}
public void notifyDataSetChanged() {
int currentPageIndex = currentPage;
container.removeAllViews();
for (int i = 0; i < controller.getData().size(); i++) {
View pageView = LayoutInflater.from(getContext()).inflate(controller.getPageLayoutRes(), container, false);
//添加至主框架View
container.addView(pageView);
ScrollView scrollView = (ScrollView) pageView.findViewById(R.id.dvp_scroll_view);
MDA_PageListLayout pageListLayout = new MDA_PageListLayout(getContext(), controller.getItemLayoutRes());
//添加View
scrollView.addView(pageListLayout);
//设置页面索引
pageListLayout.setPageIndex(i);
controller.bindPageData(pageView, i);
//设置数据
pageListLayout.setData(controller.getPage(i).getData());
}
initDragEvent(DragUtils.DragViewType.ALL);
scrollToPage(currentPageIndex);
}
public MDA_HorizontalLayout getContainer() {
return container;
}
public void initDragEvent(DragUtils.DragViewType type) {
for (int i = 0; i < container.getChildCount(); i++) {
//页面拖拽绑定监听器
ViewGroup viewGroup = (ViewGroup) container.getChildAt(i);
if (type == DragUtils.DragViewType.ITEM) {
DragUtils.removeDragEvent(viewGroup);
} else {
DragUtils.setupDragEvent(this, viewGroup, DragUtils.DragViewType.PAGE, draggedViewPagerListener);
}
//item拖拽绑定监听器
MDA_PageListLayout layout = (MDA_PageListLayout) ((ViewGroup) viewGroup.findViewById(R.id.dvp_scroll_view)).getChildAt(0);
for (int j = 0; j < layout.getChildCount(); j++) {
View view = layout.getChildAt(j);
if (type == DragUtils.DragViewType.PAGE) {
DragUtils.removeDragEvent(view);
} else {
DragUtils.setupDragEvent(this, view, DragUtils.DragViewType.ITEM, draggedViewPagerListener);
}
}
}
}
public MDA_PageListLayout getMDA_PageListLayout(int index) {
ViewGroup viewGroup = (ViewGroup) container.getChildAt(index);
return (MDA_PageListLayout) ((ViewGroup) viewGroup.findViewById(R.id.dvp_scroll_view)).getChildAt(0);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
measureChildren(widthMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
smoothScrollToPage(currentPage);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE://因为上层控件需要捕获触摸操作,因此只能在上层控件抛弃event,即本控件响应ACTION_MOVE事件时,进行处理
if (touchStartX == 0 && touchStartTime == 0) {
touchStartX = ev.getRawX();
touchStartTime = System.currentTimeMillis();
}
break;
case MotionEvent.ACTION_UP:
float touchEndX = ev.getRawX();
long touchEndTime = System.currentTimeMillis();
if (Math.abs(touchEndX - touchStartX) > pageSwitchOffsetX &&//判断X轴偏移
Math.abs(touchEndX - touchStartX) / ((touchEndTime - touchStartTime) * 1.0f / 1000) > pageSwitchSpeed) {//达到切换速度
if (touchStartX < touchEndX) {
smoothScrollToPreviousPage();
} else {
smoothScrollToNextPage();
}
} else {//未达到切换速度,通过滑动偏移量判断所处page
currentPage = (int) Math.round(getScrollX() * 1.0 / DragUtils.pageScrollWidth);
smoothScrollToCurrentPage();
}
//重置计量值
touchStartX = 0;
touchStartTime = 0;
return true;
}
return super.onTouchEvent(ev);
}
/**
* 滚动到当前页
*/
public void smoothScrollToCurrentPage() {
// Log.i(TAG, "smoothScrollToCurrentPage");
smoothScrollTo(currentPage * DragUtils.pageScrollWidth, 0);
}
/**
* 滚动到上一页
*/
public void smoothScrollToPreviousPage() {
// Log.i(TAG, "smoothScrollToPreviousPage");
if (currentPage > 0) {//不是第一页
currentPage--;
smoothScrollToCurrentPage();
}
}
/**
* 滚动到下一页
*/
public void smoothScrollToNextPage() {
// Log.i(TAG, "smoothScrollToNextPage");
if (currentPage < ((ViewGroup) getChildAt(0)).getChildCount() - 1) {//不是最后一页
currentPage++;
smoothScrollToCurrentPage();
}
}
/**
* 滚动到指定页
*
* @param pageIndex 指定页索引
*/
public void smoothScrollToPage(int pageIndex) {
// Log.i(TAG, "smoothScrollToPage");
if (pageIndex >= 0 && pageIndex <= ((ViewGroup) getChildAt(0)).getChildCount() - 1) {//指定页索引在范围内
currentPage = pageIndex;
smoothScrollToCurrentPage();
}
}
/**
* 滚动到当前页
*/
public void scrollToCurrentPage() {
// Log.i(TAG, "scrollToCurrentPage");
scrollTo(currentPage * DragUtils.pageScrollWidth, 0);
}
/**
* 滚动到上一页
*/
public void scrollToPreviousPage() {
// Log.i(TAG, "scrollToPreviousPage");
if (currentPage > 0) {//不是第一页
currentPage--;
scrollToCurrentPage();
}
}
/**
* 滚动到下一页
*/
public void scrollToNextPage() {
// Log.i(TAG, "scrollToNextPage");
if (currentPage < ((ViewGroup) getChildAt(0)).getChildCount() - 1) {//不是最后一页
currentPage++;
scrollToCurrentPage();
}
}
/**
* 滚动到指定页
*
* @param pageIndex 指定页索引
*/
public void scrollToPage(int pageIndex) {
// Log.i(TAG, "scrollToPage");
if (pageIndex >= 0 && pageIndex <= ((ViewGroup) getChildAt(0)).getChildCount() - 1) {//指定页索引在范围内
currentPage = pageIndex;
scrollToCurrentPage();
}
}
public int getCurrentPage() {
return currentPage;
}
}