/*
* Created by LuaView.
* Copyright (c) 2017, Alibaba Group. All rights reserved.
*
* This source code is licensed under the MIT.
* For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
*/
package com.taobao.luaview.view.indicator;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.HorizontalScrollView;
import com.taobao.android.luaview.R;
import com.taobao.luaview.global.Constants;
import com.taobao.luaview.userdata.base.UDLuaTable;
import com.taobao.luaview.userdata.indicator.UDCustomViewPagerIndicator;
import com.taobao.luaview.userdata.ui.UDView;
import com.taobao.luaview.userdata.ui.UDViewGroup;
import com.taobao.luaview.util.LuaViewUtil;
import com.taobao.luaview.view.LVViewGroup;
import com.taobao.luaview.view.indicator.circle.IcsLinearLayout;
import com.taobao.luaview.view.indicator.circle.PageIndicator;
import com.taobao.luaview.view.interfaces.ILVView;
import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
/**
* LuaView-ViewPagerIndicator
* 容器类
*
* @author song
* @date 15/8/20
*/
public class LVCustomViewPagerIndicator extends HorizontalScrollView implements ILVView, PageIndicator {
private LuaValue mInitParams;
private UDCustomViewPagerIndicator mLuaUserdata;
//数据
private final IcsLinearLayout mLayout;
private ViewPager mViewPager;
private ViewPager.OnPageChangeListener mListener;
private Runnable mSelector;
private int mSelectedIndex;
public LVCustomViewPagerIndicator(Globals globals, LuaValue metaTable, Varargs varargs) {
super(globals.getContext());
this.mInitParams = varargs != null ? varargs.arg1() : null;
this.mLuaUserdata = new UDCustomViewPagerIndicator(this, globals, metaTable, this.mInitParams);
this.mLayout = new IcsLinearLayout(globals.getContext(), R.attr.lv_vpiIconPageIndicatorStyle);
init();
}
private void init() {
this.setHorizontalScrollBarEnabled(false);
super.addView(mLayout, LuaViewUtil.createRelativeLayoutParamsMM());
}
@Override
public UDView getUserdata() {
return mLuaUserdata;
}
/**
* 移动到某个位置
*
* @param position
*/
private void animateTo(final int position) {
final View iconView = mLayout.getChildAt(position);
if (mSelector != null) {
removeCallbacks(mSelector);
}
mSelector = new Runnable() {
public void run() {
final int scrollPos = iconView.getLeft() - (getWidth() - iconView.getWidth()) / 2;
smoothScrollTo(scrollPos, 0);
mSelector = null;
}
};
post(mSelector);
}
/**
* 创建一个item
*
* @param pos
* @return
*/
private View createAndRenderView(int pos) {
final int currentItem = mViewPager.getCurrentItem();
final LuaValue cellData = createView(pos, currentItem);
if (cellData instanceof UDLuaTable) {
mLuaUserdata.callCellLayout(cellData, pos, currentItem);//绘制
return ((UDLuaTable) cellData).getView();
}
return null;
}
/**
* create view
*
* @param pos
* @return
*/
private LuaValue createView(int pos, int currentItem) {
Globals globals = this.mLuaUserdata.getGlobals();
//View封装
final LVViewGroup container = createCellLayout();
final UDViewGroup cell = new UDViewGroup(container, globals, null);
//对外数据封装,必须使用LuaTable
final UDLuaTable cellData = new UDLuaTable(cell);
//call init
globals.saveContainer(container);
this.mLuaUserdata.callCellInit(cellData, pos, currentItem);//初始化
globals.restoreContainer();
//set tag
View view = cellData.getView();
if (view != null) {
view.setTag(Constants.RES_LV_TAG, cellData);
}
return cellData;
}
/**
* 创建 cell 的布局
*
* @return
*/
private LVViewGroup createCellLayout() {
return new LVViewGroup(mLuaUserdata.getGlobals(), mInitParams.getmetatable(), null);
}
//-----------------------------------------page indicator方法------------------------------------
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (mSelector != null) {
post(mSelector);
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mSelector != null) {
removeCallbacks(mSelector);
}
}
@Override
public void setViewPager(ViewPager view) {
if (mViewPager == view) {
return;
}
if (mViewPager != null) {
mViewPager.setOnPageChangeListener(null);
}
PagerAdapter adapter = view.getAdapter();
if (adapter == null) {
throw new IllegalStateException("ViewPager does not have adapter instance.");
}
mViewPager = view;
view.setOnPageChangeListener(this);
notifyDataSetChanged();
}
@Override
public void setViewPager(ViewPager view, int initialPosition) {
setViewPager(view);
setCurrentItem(initialPosition);
}
@Override
public void setCurrentItem(int item) {
if (mViewPager == null) {
throw new IllegalStateException("ViewPager has not been bound.");
}
mSelectedIndex = item;
mViewPager.setCurrentItem(item);
int tabCount = mLayout.getChildCount();
for (int i = 0; i < tabCount; i++) {
View child = mLayout.getChildAt(i);
boolean isSelected = (i == item);
child.setSelected(isSelected);
if (isSelected) {
animateTo(item);
}
//TODO 这里需要优化一下,实现的太低效,有bug
Object obj = child.getTag(Constants.RES_LV_TAG);
if (obj instanceof LuaValue) {
LuaValue cellData = (LuaValue) obj;
mLuaUserdata.callCellLayout(cellData, i, item);//绘制
}
}
}
public int getCurrentItem() {
return mViewPager != null ? mViewPager.getCurrentItem() : 0;
}
@Override
public void setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
mListener = onPageChangeListener;
}
@Override
public void notifyDataSetChanged() {
mLayout.removeAllViews();
PagerAdapter adapter = mViewPager.getAdapter();
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
View view = createAndRenderView(i);
mLayout.addView(view);
}
if (mSelectedIndex > count) {
mSelectedIndex = count - 1;
}
setCurrentItem(mSelectedIndex);
requestLayout();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (mListener != null) {
mListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
}
@Override
public void onPageSelected(int position) {
setCurrentItem(position);
if (mListener != null) {
mListener.onPageSelected(position);
}
}
@Override
public void onPageScrollStateChanged(int state) {
if (mListener != null) {
mListener.onPageScrollStateChanged(state);
}
}
}