Code Monkey home page Code Monkey logo

android-tv-guide-viewpager's Introduction

Android-tv-guide-viewpager

感谢Trinea开源工具的帮助,了解了循环机制

自定义ViewPager,实现TV开机引导图,同时支持手机

1、Android原生的viewpager速度不能自己控制,所以我们需要自定义滑动速度,达到我们想要的效果 TV上不再是手势滑动,而是遥控按键,所以TV和手机上的ViewPager的实现效果和触发条件略有不同 而且TV上的ViewPage可能需要自动切换到下一页的需求

2、自定义viewpager,可以直接引用ScrollViewPager.java

3、viewpager + fragment,详细使用可以查看MainFragmentActivity.java

4、自定义viewpager,自动切换+循环播放GuideViewPage,详细使用可以查看GuideViewPagerActivity.java

5、使用v7包ActionBarActivity

效果图

图片名称

图片名称

###7.18更新 1、编写通用DPBasePageAdapter,供扩展使用,DPAdapterViewHolder使用DPBaseAdapter-Android中的viewholder
2、添加数据model和布局item
3、动态设置页面滑动速度
3、添加每一页监听,保存item当前位置position

7.19更新

1、添加viewPager循环机制
2、添加adapter多个构造函数,方便调用

7.20更新

1、添加viewPager当前position 回调
2、界面现实index/count 数比

7.21 更新

1、添加自定义viewpager,可以控制滑动速度
2、添加viewpager+fragment方式

7.22 更新

1、继承ActionBarActivity,实现Menu跳转其他demo界面
2、同时修复ViewPager图片位置错误问题

###下一步 1、添加viewPager循环机制 7.20已完成
2、支持new出来的view添加,不再只是布局(意义不大,最初GuidePagerAdapter使用new的方式,可参考)
3、抽象出BaseFragment

实例

目前需要配置Manifest文件
1、GuideViewPagerActivity.java支持自动滑动,遥控按键及手势和循环播放
2、MainFragmentActivity.java两种模式,原生viewpager+imageview,自定义viewpager+fragment

###使用方法 xml文件:

  <tv.guide.pager.widget.GuideViewPage
        android:id="@+id/vp_activity"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
  </tv.guide.pager.widget.GuideViewPage>
  
GuideViewPage mViewPage = (GuideViewPage) findViewById(R.id.vp_activity);

###代码实现

  //三个参数
  mGuidePagerAdapter = new DPGuidePagerAdapter(mContext,mImageIdList,R.layout.page_item);
  mViewPage.setAdapter(mGuidePagerAdapter);
  mViewPage.startAutoScroll();//设置自动播放
  mViewPage.setScollTime(5);//设置滑动速度
  
  //选择不同方式调用
  mGuidePagerAdapter = new DPGuidePagerAdapter(mContext,mImageIdList,R.layout.page_item).setInfiniteLoop(true);
  mGuidePagerAdapter = new DPGuidePagerAdapter(mContext,mImageIdList,R.layout.page_item,true);
  //...
  mGuidePagerAdapter.setInfiniteLoop(true);

###页面处理 目前逻辑是写在activity中的,以后打算抽到viewpager控件中,采用回调方式

	private boolean dispatchKeyMultipleGuide(KeyEvent event) {
		int keyCode = event.getKeyCode();
		ViewPagerState state = mViewPage.getState();
		if (event.getAction() == KeyEvent.ACTION_DOWN) {
			if (keyCode == KeyEvent.KEYCODE_DPAD_UP || keyCode == KeyEvent.KEYCODE_DPAD_DOWN || keyCode == KeyEvent.KEYCODE_MENU) {
				return true;
			}
			if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_BACK) {
				if (state == ViewPagerState.RIGHT_EDGE) {
					startHomePage();
					return true;
				}
				mViewPage.scrollOnce();
				return true;
			}
		}
		return super.dispatchKeyEvent(event);
	}

###循环机制 增长数据重复,实际上真正view个数不变,通过去余来获得循环的position数据

   @Override
    public int getCount() {
        return mIsInfiniteLoop ? Integer.MAX_VALUE : ListUtils.getCount(mDataList);
    }

  private int getPosition(int position) {
        return mIsInfiniteLoop ? position % mDataList.size() : position;
    }
    
  public DPGuidePagerAdapter setInfiniteLoop(boolean isInfiniteLoop) {
	mIsInfiniteLoop = isInfiniteLoop;
	return this;
   }

回调接口

	public interface ViewPagerOnSelectedListener {
	    void onViewPageSelected(int position);
	}

接口使用

	@Override
	public void onViewPageSelected(int position) {
	//判断当前是否是循环,如果循环则对position取余
	if (mGuidePagerAdapter.getInfiniteLoop()){
		position = position % COUNT;
	}
		mIndexText.setText(new StringBuilder().append(position + 1).append("/").append(COUNT));
	}

###生命周期 遵循Activity的生命周期

  	@Override
	protected void onPause() {
		super.onPause();
		mViewPage.stopAutoScroll();
	}
	
	@Override
	protected void onStop() {
		super.onStop();
		mViewPage.stopAutoScroll();
	}
	@Override
	protected void onResume() {
		super.onResume();
		mViewPage.startAutoScroll();
	}

Manifest文件配置

使用标签来制定主activity也就是main <intent-filter>
	 <activity
            android:name=".MainFragmentActivity"
            android:label="@string/title_activity_main_fragment" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

自定义viewpager

重写Scroller,更改平易时间

	class FixedSpeedScroller extends Scroller {

		public FixedSpeedScroller(Context context) {
			super(context);
		}

		public FixedSpeedScroller(Context context, Interpolator interpolator) {
			super(context, interpolator);
		}

		@Override
		public void startScroll(int startX, int startY, int dx, int dy,int duration) {
			super.startScroll(startX, startY, dx, dy, mScrollDuration);
		}

		@Override
		public void startScroll(int startX, int startY, int dx, int dy) {
			super.startScroll(startX, startY, dx, dy, mScrollDuration);
		}
	}

布局中使用

    <tv.guide.pager.widget.ScrollViewPager
        android:id="@+id/viewpager_f2"
        android:layout_width="match_parent"
        android:layout_height="320dp"
        android:layout_below="@+id/viewpager_f"
        android:background="#CC99FF">
    </tv.guide.pager.widget.ScrollViewPager>

================ ######更多内容请关注我的github,也欢迎大家到Issues提问题

android-tv-guide-viewpager's People

Contributors

whiskeyfei avatar

Watchers

Conan avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.