SlideShowView用viewpaper实现图片轮播效果
来源:互联网 发布:淘宝新锐卖家审核标准 编辑:程序博客网 时间:2024/06/05 07:04
主代码:
public class SlideShowView extends FrameLayout { // 使用universal-image-loader插件读取网络图片,需要工程导入universal-image-loader-1.8.6-with-sources.jar public List<SliderShowViewItem> list = new ArrayList<SliderShowViewItem>(); public List<SliderShowViewItem> getList() { return list; } private static ImageLoader imageLoader = ImageLoader.getInstance(); private static DisplayImageOptions options; // 轮播图图片数量 private final static int IMAGE_COUNT = 5; // 自动轮播的时间间隔 private final static int TIME_INTERVAL = 5; // 自动轮播启用开关 private final static boolean isAutoPlay = true; // 自定义轮播图的资源 private List<String> imageUrls; // 放轮播图片的ImageView 的list private List<ImageView> imageViewsList; private List<String> foodnameList; public List<ImageView> getImageViewsList() { return imageViewsList; } // 放圆点的View的list private List<View> dotViewsList; private ViewPager viewPager; // 当前轮播页 private int currentItem = 0; // 定时任务 private ScheduledExecutorService scheduledExecutorService; private Context context; private TextView foodnametextview; // Handler private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); // Log.i("gundong", currentItem + ""); viewPager.setCurrentItem(currentItem); foodnametextview.setText(foodnameList.get(currentItem)); } }; /** * * @param context * * * public View (Context context)是在java代码创建视图的时候被调用,如果是从xml填充的视图,就不会调用这个 public View (Context context, AttributeSet attrs)这个是在xml创建但是没有指定style的时候被调用 public View (Context context, AttributeSet attrs, int defStyle)这个也是在xml创建指定style的时候被调用 */ public SlideShowView(Context context) { this(context, null); // TODO Auto-generated constructor stub } public SlideShowView(Context context, AttributeSet attrs) { this(context, attrs, 0); // TODO Auto-generated constructor stub } public SlideShowView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; initImageLoader(context); initData(); } /** * 开始轮播图切换 */ private void startPlay() { scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 4, TimeUnit.SECONDS); } /** * 停止轮播图切换 */ private void stopPlay() { scheduledExecutorService.shutdown(); } /** * 初始化相关Data */ private void initData() { imageViewsList = new ArrayList<ImageView>(); dotViewsList = new ArrayList<View>(); imageUrls = new ArrayList<String>(); foodnameList = new ArrayList<String>(); // 一步任务获取图片 new GetListTask().execute(""); } /** * 初始化Views等UI */ private void initUI(Context context) { if (imageUrls == null || imageUrls.size() == 0) return; LayoutInflater.from(context).inflate(R.layout.layout_slideshow, this, true); LinearLayout dotLayout = (LinearLayout) findViewById(R.id.dotLayout); dotLayout.removeAllViews(); // 热点个数与图片特殊相等 for (int i = 0; i < imageUrls.size(); i++) { ImageView view = new ImageView(context); view.setTag(imageUrls.get(i)); if (i == 0)// 给一个默认图 view.setBackgroundResource(R.drawable.xiaolian); view.setScaleType(ScaleType.FIT_XY); imageViewsList.add(view); ImageView dotView = new ImageView(context); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.leftMargin = 4; params.rightMargin = 4; dotLayout.addView(dotView, params); dotViewsList.add(dotView); } viewPager = (ViewPager) findViewById(R.id.viewPager); foodnametextview = (TextView) findViewById(R.id.foodname); viewPager.setFocusable(true); viewPager.setAdapter(new MyPagerAdapter()); viewPager.setOnPageChangeListener(new MyPageChangeListener()); if (isAutoPlay) { startPlay(); } } /** * 填充ViewPager的页面适配器 * */ private class MyPagerAdapter extends PagerAdapter { @Override public void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub // ((ViewPag.er)container).removeView((View)object); ((ViewPager) container).removeView(imageViewsList.get(position)); } @Override public Object instantiateItem(View container, final int position) { ImageView imageView = imageViewsList.get(position); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(context, SliderShowViewTeachcontent.class); Bundle bundle = new Bundle(); bundle.putString("url", list.get(position).getLink()); bundle.putInt("flag", 1); intent.putExtras(bundle); context.startActivity(intent); } }); imageLoader.displayImage(imageView.getTag() + "", imageView, options); ((ViewPager) container).addView(imageViewsList.get(position)); return imageViewsList.get(position); } @Override public int getCount() { // TODO Auto-generated method stub return imageViewsList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { // TODO Auto-generated method stub } @Override public Parcelable saveState() { // TODO Auto-generated method stub return null; } @Override public void startUpdate(View arg0) { // TODO Auto-generated method stub } @Override public void finishUpdate(View arg0) { // TODO Auto-generated method stub } } /** * ViewPager的监听器 当ViewPager中页面的状态发生改变时调用 * */ private class MyPageChangeListener implements OnPageChangeListener { boolean isAutoPlay = false; @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub switch (arg0) { case 1:// 手势滑动,空闲中 isAutoPlay = false; break; case 2:// 界面切换中 isAutoPlay = true; break; case 0:// 滑动结束,即切换完毕或者加载完毕 // 当前为最后一张,此时从右向左滑,则切换到第一张 if (viewPager.getCurrentItem() == viewPager.getAdapter() .getCount() - 1 && !isAutoPlay) { viewPager.setCurrentItem(0); // foodnametextview.setText(foodnameList.get(0)); } // 当前为第一张,此时从左向右滑,则切换到最后一张 else if (viewPager.getCurrentItem() == 0 && !isAutoPlay) { viewPager .setCurrentItem(viewPager.getAdapter().getCount() - 1); // foodnametextview.setText(viewPager.getAdapter().getCount() // - 1); } break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int pos) { // TODO Auto-generated method stub currentItem = pos; for (int i = 0; i < dotViewsList.size(); i++) { if (i == pos) { ((View) dotViewsList.get(pos)) .setBackgroundResource(R.drawable.dot_focus); } else { ((View) dotViewsList.get(i)) .setBackgroundResource(R.drawable.dot_blur); } } } } /** * 执行轮播图切换任务 * */ private class SlideShowTask implements Runnable { @Override public void run() { // TODO Auto-generated method stub synchronized (viewPager) { currentItem = (currentItem + 1) % imageViewsList.size(); handler.obtainMessage().sendToTarget(); } } } /** * 销毁ImageView资源,回收内存 * */ private void destoryBitmaps() { for (int i = 0; i < IMAGE_COUNT; i++) { ImageView imageView = imageViewsList.get(i); Drawable drawable = imageView.getDrawable(); if (drawable != null) { // 解除drawable对view的引用 drawable.setCallback(null); } } } /** * 异步任务,获取数据 * */ class GetListTask extends AsyncTask<String, Integer, Boolean> { @Override protected Boolean doInBackground(String... params) { try { // 这里一般调用服务端接口获取一组轮播图片,下面是从百度找的几个图片 list = new SliderShowViewItemBiz() .getNewsItems("http://www.meishij.net/"); for (int i = 0; i < list.size(); i++) { // Log.i("msg", list.get(i).getImgLink()); imageUrls.add(list.get(i).getImgLink()); foodnameList.add(list.get(i).getFoodname()); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); if (result) { initUI(context); } } } /** * ImageLoader 图片组件初始化 * * @param context */ public static void initImageLoader(Context context) { imageLoader.init(ImageLoaderConfiguration.createDefault(context)); options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.xiaolian) .showImageForEmptyUri(R.drawable.ic_launcher) .showImageOnFail(R.drawable.ic_launcher).cacheInMemory() .cacheOnDisc().displayer(new RoundedBitmapDisplayer(20)) .displayer(new FadeInBitmapDisplayer(300)).build(); }}
布局文件:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" > <TextView android:id="@+id/foodname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginLeft="10dp" android:text="美食推荐" android:textColor="@color/white" android:textSize="20dp" /> <LinearLayout android:id="@+id/dotLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="right" android:orientation="horizontal" android:padding="8dp" > <View android:id="@+id/v_dot1" android:layout_width="8dp" android:layout_height="8dp" android:background="@drawable/dot_focus" /> <View android:id="@+id/v_dot2" android:layout_width="8dp" android:layout_height="8dp" android:layout_marginLeft="5dp" android:background="@drawable/dot_blur" /> </LinearLayout> </FrameLayout></RelativeLayout>
使用该自定义控件的用法:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <FrameLayout android:id="@+id/SlideShowView" android:layout_width="fill_parent" android:layout_height="150dp" > <com.example.slideshowdemo.customview.SlideShowView android:id="@+id/slideshowView" android:layout_width="fill_parent" android:layout_height="150dp" android:layout_centerHorizontal="true" /> </FrameLayout> <GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="203dp" android:horizontalSpacing="0.0dip" android:listSelector="@null" android:numColumns="3" android:scrollbars="none" android:stretchMode="columnWidth" android:verticalSpacing="0.0dip" > </GridView></LinearLayout>
0 0
- SlideShowView用viewpaper实现图片轮播效果
- ViewPaper实现轮播广告条
- ViewPaper实现轮播广告条
- 用slide实现图片轮播效果
- 用Jquery实现轮播图片效果
- 2个js实现图片轮播效果(用)
- JQuery实现图片轮播效果
- JQuery实现图片轮播效果
- 使用Jquery实现图片轮播效果
- islider实现图片轮播效果
- js实现图片轮播效果
- 图片轮播效果,实现思想!
- JS图片轮播切换效果实现
- jQuery实现图片轮播效果
- ViewPage实现图片轮播效果
- jquery实现图片轮播效果
- 图片轮播效果的实现
- RollViewPager实现android图片轮播效果
- 内核调度对象简介
- 可以填空的TextView
- 【个人整理】NOIP知识点汇总
- Bean装配细节
- R语言ggplot2 legend name/横坐标名字更改
- SlideShowView用viewpaper实现图片轮播效果
- openstack常用命令
- C++ map的基本操作和使用
- C#—变量、常量
- KeXxxTimer例程, KTIMER对象, 和DPC
- 【读书笔记】【Android 开发艺术探索】第1章 Activity 的生命周期和启动模式
- 《数据结构与算法分析(c描述)》——二叉搜索树实现
- 12-题目1156:谁是你的潜在朋友
- C语言sscanf函数的总结