android TV开发:使用ViewPager实现图片自动轮播效果
2016-10-26 21:43
1031 查看
1.实现效果:ViewPager的子view响应点击事件 + 焦点脱离父控件(遥控器按键从子view直接跳到旁边控件)
(由于gif最大只能是2M,就只能录屏时间这么短,建议csdn可以上传容量更大的图片)
2.实现思路:ViewPager+自定义PagerAdapter+定时器ScheduledExecutorService
主要关注点:
①ScheduledExecutorService(定时周期的执行任务)
3.具体实现代码如下
4.源码+apk下载
主要参考 http://blog.csdn.net/l1028386804/article/details/48049913
(由于gif最大只能是2M,就只能录屏时间这么短,建议csdn可以上传容量更大的图片)
2.实现思路:ViewPager+自定义PagerAdapter+定时器ScheduledExecutorService
主要关注点:
①ScheduledExecutorService(定时周期的执行任务)
public class MainActivity extends AppCompatActivity { private ScheduledExecutorService scheduledExecutorService; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { mViewPaper.setCurrentItem(currentItem); } }; //... @Override protected void onStart() { super.onStart(); // 产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。 scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleWithFixedDelay(new ViewPageTask(), 4,4, TimeUnit.SECONDS); } private class ViewPageTask implements Runnable { @Override public void run() { currentItem = (currentItem + 1) % imageIds.length; mHandler.sendEmptyMessage(0); } } @Override protected void onStop() { super.onStop(); if (scheduledExecutorService != null) { scheduledExecutorService.shutdown(); scheduledExecutorService = null; } } //.... }②ViewPagerAdapter中的instantiateItem()函数
//做了两件事,第一:将当前视图添加到container中,第二:返回当前View @Override public Object instantiateItem(ViewGroup container, final int position) { container.addView(images.get(position)); ImageView imageView = images.get(position); imageView.setBackgroundResource(R.drawable.button_style); imageView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT && event.getAction() == KeyEvent.ACTION_DOWN) { rightImgView2.requestFocusFromTouch(); rightImgView2.requestFocus(); return true; } if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT && event.getAction() == KeyEvent.ACTION_DOWN) { rightImgView.requestFocusFromTouch(); rightImgView.requestFocus(); return true; } return false; } }); imageView.setFocusable(true); imageView.setFocusableInTouchMode(true); imageView.setClickable(true); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "点击了第" + "" + position + "张图片", Toast.LENGTH_LONG).show(); } }); return imageView; }imageView是viewPager的子view,rightImgView2是viewPager旁边的控件
3.具体实现代码如下
public class MainActivity extends AppCompatActivity { private ViewPager mViewPaper; private List<ImageView> images; private List<View> dots; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { mViewPaper.setCurrentItem(currentItem); } }; private int currentItem; //记录上一次点的位置 private int oldPosition = 0; private TextView title; private ViewPagerAdapter adapter; private ScheduledExecutorService scheduledExecutorService; //存放图片的id private int[] imageIds = new int[]{ R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e }; //存放图片的标题 private String[] titles = new String[]{ "挑战者联盟,薛之谦又来辣", "老九门,又是李易峰这个傻叉", "红色通道,再看刘烨英俊潇洒", "神犬小七,小七居然是只猪", "灭罪师,鬼知道这是什么剧" }; private ImageView rightImgView; private ImageView rightImgView1; private ImageView rightImgView2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //定义mViewPaper旁边的控件 rightImgView = new ImageView(this); rightImgView = (ImageView) findViewById(R.id.rightImgView); rightImgView.setImageResource(R.drawable.right); rightImgView1 = new ImageView(this); rightImgView1 = (ImageView) findViewById(R.id.rightImgView1); rightImgView1.setImageResource(R.drawable.right); rightImgView2 = new ImageView(this); rightImgView2 = (ImageView) findViewById(R.id.rightImgView3); rightImgView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,MyGallaryActivity.class); startActivity(intent); } }); mViewPaper = (ViewPager) findViewById(R.id.vp); //显示的图片 images = new ArrayList<ImageView>(); for (int i = 0; i < imageIds.length; i++) { ImageView imageView = new ImageView(this); imageView.setImageResource(imageIds[i]); images.add(imageView); } //显示的小点 dots = new ArrayList<View>(); dots.add(findViewById(R.id.dot_0)); dots.add(findViewById(R.id.dot_1)); dots.add(findViewById(R.id.dot_2)); dots.add(findViewById(R.id.dot_3)); dots.add(findViewById(R.id.dot_4)); title = (TextView) findViewById(R.id.title); title.setText(titles[0]); mViewPaper.setAdapter(adapter = new ViewPagerAdapter(this, images)); //禁止手指控制滑动 mViewPaper.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); mViewPaper.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { title.setText(titles[position]); dots.get(position).setBackgroundResource(R.drawable.dot_focused); dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal); oldPosition = position; currentItem = position; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } @Override protected void onStart() { super.onStart(); // 产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。 scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleWithFixedDelay(new ViewPageTask(), 4,4, TimeUnit.SECONDS); } private class ViewPageTask implements Runnable { @Override public void run() { currentItem = (currentItem + 1) % imageIds.length; mHandler.sendEmptyMessage(0); } } @Override protected void onStop() { super.onStop(); if (scheduledExecutorService != null) { scheduledExecutorService.shutdown(); scheduledExecutorService = null; } } public class ViewPagerAdapter extends PagerAdapter { private List<ImageView> images; private Context mContext; public ViewPagerAdapter(Context context, List<ImageView> img) { this.mContext = context; this.images = img; } //返回要滑动的VIew的个数 @Override public int getCount() { return images.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } //从当前container中删除指定位置(position)的View; @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(images.get(position)); } //做了两件事,第一:将当前视图添加到container中,第二:返回当前View @Override public Object instantiateItem(ViewGroup container, final int position) { container.addView(images.get(position)); ImageView imageView = images.get(position); imageView.setBackgroundResource(R.drawable.button_style); imageView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT && event.getAction() == KeyEvent.ACTION_DOWN) { rightImgView2.requestFocusFromTouch(); rightImgView2.requestFocus(); return true; } if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT && event.getAction() == KeyEvent.ACTION_DOWN) { rightImgView.requestFocusFromTouch(); rightImgView.requestFocus(); return true; } return false; } }); imageView.setFocusable(true); imageView.setFocusableInTouchMode(true); imageView.setClickable(true); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "点击了第" + "" + position + "张图片", Toast.LENGTH_LONG).show(); } }); return imageView; } } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000000"> <FrameLayout android:id="@+id/leftView" android:layout_marginTop="80dp" android:layout_marginLeft="80dp" android:layout_width="600dp" android:layout_height="300dp" > <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:layout_width="match_parent" android:layout_height="35dip" android:layout_gravity="bottom" android:background="#00000000" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="图片标题" android:textColor="@android:color/white" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dip" android:orientation="horizontal" > <View android:id="@+id/dot_0" android:layout_width="5dip" android:layout_height="5dip" android:layout_marginLeft="2dip" android:layout_marginRight="2dip" android:background="@drawable/dot_focused"/> <View android:id="@+id/dot_1" android:layout_width="5dip" android:layout_height="5dip" android:layout_marginLeft="2dip" android:layout_marginRight="2dip" android:background="@drawable/dot_normal"/> <View android:id="@+id/dot_2" android:layout_width="5dip" android:layout_height="5dip" android:layout_marginLeft="2dip" android:layout_marginRight="2dip" android:background="@drawable/dot_normal"/> <View android:id="@+id/dot_3" android:layout_width="5dip" android:layout_height="5dip" android:layout_marginLeft="2dip" android:layout_marginRight="2dip" android:background="@drawable/dot_normal"/> <View android:id="@+id/dot_4" android:layout_width="5dip" android:layout_height="5dip" android:layout_marginLeft="2dip" android:layout_marginRight="2dip" android:background="@drawable/dot_normal"/> </LinearLayout> </LinearLayout> </FrameLayout> <ImageView android:layout_toRightOf="@+id/leftView" android:layout_marginTop="80dp" android:layout_marginLeft="10dp" android:id="@+id/rightImgView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/button_style" android:src="@drawable/right" android:clickable="true" android:focusable="true" android:focusableInTouchMode="true" /> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/leftView" android:layout_marginLeft="80dp" android:layout_marginTop="5dp"> <ImageView android:id="@+id/rightImgView" android:layout_width="344dp" android:layout_height="216dp" android:background="@drawable/button_style" android:clickable="true" android:focusable="true" android:focusableInTouchMode="true" /> <ImageView android:id="@+id/rightImgView1" android:layout_marginLeft="370dp" android:layout_width="344dp" android:layout_height="216dp" android:background="@drawable/button_style" android:clickable="true" android:focusable="true" android:focusableInTouchMode="true" /> </FrameLayout> </RelativeLayout>
4.源码+apk下载
主要参考 http://blog.csdn.net/l1028386804/article/details/48049913
相关文章推荐
- 使用ViewPager实现图片自动播放效果,并可左右滑动
- Android开发之使用ViewPager实现图片左右滑动切换效果
- Android开发之使用viewpager实现图片轮播(二)
- ViewPager+Handler实现图片自动轮播的效果
- Android中ViewPager的使用(二):实现图片轮播效果
- Android使用ViewPager实现图片轮播(高度自适应,左右循环,自动轮播)
- Android使用ViewPager实现左右循环滑动及轮播效果
- Android使用ViewPager实现左右循环滑动及轮播效果
- Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View---转
- Android使用ViewPager实现左右循环滑动及轮播效果
- 使用ViewPager实现自动无限循环的轮播
- Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View
- 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
- 使用ViewPager实现图片轮播
- android开发之滑动效果实现图片浏览_ViewFilpper的使用
- viewFlipper的使用实现自动轮播广告图片
- Android Viewpager实现图片轮播(仿优酷效果)
- Android使用ViewPager实现左右循环滑动及轮播效果
- Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View
- ViewPager + Handler 实现的图片自动轮播