最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android開發(fā)實(shí)現(xiàn)廣告無限循環(huán)功能示例

 更新時(shí)間:2017年11月06日 10:34:43   作者:LovooGod  
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)廣告無限循環(huán)功能,結(jié)合完整實(shí)例形式分析了Android廣告圖片輪播功能的具體實(shí)現(xiàn)步驟與相關(guān)功能、布局等操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Android開發(fā)實(shí)現(xiàn)廣告無限循環(huán)功能。分享給大家供大家參考,具體如下:

一、效果圖:

二、代碼實(shí)現(xiàn):

/**
 * 新聞首頁
 *
 * @Project App_Card
 * @Package com.android.koomama.fragment.home
 * @author chenlin
 * @version 1.0
 * @Date 2014年6月22日
 * @Note TODO
 */
public class NewsHomeFragment extends BaseFragment implements OnTouchListener {
  private ImageHandler mHandler = new ImageHandler(new WeakReference<NewsHomeFragment>(this));
  private ViewPager mViewPager;
  // 自定義輪播圖的資源
  private int[] mImageResIds = { R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4, R.drawable.img5 };
  // 放輪播圖片的ImageView 的list
  private List<ImageView> mImageList = new ArrayList<ImageView>();
  // 放圓點(diǎn)的View的list
  private List<View> mDotList = new ArrayList<View>();
  @Override
  public View initConvertView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_news_main, container, false);
  }
  @Override
  protected void onVisible(boolean isInit) {
    if (isInit) {
      initViews();
    }
  }
  private void initViews() {
    // 初始化iewPager的內(nèi)容
    mViewPager = (ViewPager) mConvertView.findViewById(R.id.view_pager);
    LinearLayout dotLayout = (LinearLayout) mConvertView.findViewById(R.id.dotLayout);
    dotLayout.removeAllViews();
    for (int i = 0; i < mImageResIds.length; i++) {
      ImageView imageView = new ImageView(getActivity());
      imageView.setScaleType(ScaleType.FIT_XY);
      // view.setTag(mImageResId[i]);
      imageView.setImageResource(mImageResIds[i]);
      mImageList.add(imageView);
      View dotView = new View(getActivity());
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen.dot_width),
          getResources().getDimensionPixelSize(R.dimen.dot_width));
      params.setMargins(4, 0, 4, 0);
      dotView.setLayoutParams(params);
//     if (i == 0) {
//       dotView.setBackgroundResource(R.drawable.dot_red);
//     } else {
//       dotView.setBackgroundResource(R.drawable.dot_gray);
//     }
      dotLayout.addView(dotView);
      mDotList.add(dotView);
    }
    mViewPager.setAdapter(new ImageAdapter(mImageList));
    mViewPager.setOnPageChangeListener(new PageChangeListener());
    mViewPager.setFocusable(true);
    mViewPager.setCurrentItem(Integer.MAX_VALUE / 2);// 默認(rèn)在中間,使用戶看不到邊界
    mViewPager.setOnTouchListener(this);
    // 開始輪播效果
    mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
  }
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
      mHandler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
      break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
      mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
      break;
    }
    return false;
  }
  private class PageChangeListener implements OnPageChangeListener {
    // 配合Adapter的currentItem字段進(jìn)行設(shè)置。
    @Override
    public void onPageSelected(int position) {
      // 這個(gè)是設(shè)置左滑切換底部view的邊界,必須要設(shè)置
      App.getInstance().setBorderViewPosition(position);
      mHandler.sendMessage(Message.obtain(mHandler, ImageHandler.MSG_PAGE_CHANGED, position, 0));
    }
    @Override
    public void onPageScrolled(int position, float arg1, int arg2) {
    }
    // 覆寫該方法實(shí)現(xiàn)輪播效果的暫停和恢復(fù)
    @Override
    public void onPageScrollStateChanged(int state) {
      switch (state) {
      case ViewPager.SCROLL_STATE_DRAGGING:
        mHandler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
        break;
      case ViewPager.SCROLL_STATE_IDLE:
        mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
        break;
      default:
        break;
      }
    }
  }
  private class ImageAdapter extends PagerAdapter {
    private List<ImageView> viewlist;
    public ImageAdapter(List<ImageView> viewlist) {
      this.viewlist = viewlist;
    }
    @Override
    public int getCount() {
      // 設(shè)置成最大,使用戶看不到邊界
      return Integer.MAX_VALUE;
    }
    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
      return arg0 == arg1;
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
      // Warning:不要在這里調(diào)用removeView
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      // 對(duì)ViewPager頁號(hào)求模取出View列表中要顯示的項(xiàng)
      position %= viewlist.size();
      if (position < 0) {
        position = viewlist.size() + position;
      }
      ImageView view = viewlist.get(position);
      // 如果View已經(jīng)在之前添加到了一個(gè)父組件,則必須先remove,否則會(huì)拋出IllegalStateException。
      ViewParent vp = view.getParent();
      if (vp != null) {
        ViewGroup parent = (ViewGroup) vp;
        parent.removeView(view);
      }
      container.addView(view);
      // 此處可添加監(jiān)聽事件
      return view;
    }
  }
  private static class ImageHandler extends Handler {
    /**
     * 請(qǐng)求更新顯示的View。
     */
    protected static final int MSG_UPDATE_IMAGE = 1;
    /**
     * 請(qǐng)求暫停輪播。
     */
    protected static final int MSG_KEEP_SILENT = 2;
    /**
     * 請(qǐng)求恢復(fù)輪播。
     */
    protected static final int MSG_BREAK_SILENT = 3;
    /**
     * 記錄最新的頁號(hào),當(dāng)用戶手動(dòng)滑動(dòng)時(shí)需要記錄新頁號(hào),否則會(huì)使輪播的頁面出錯(cuò)。
     * 例如當(dāng)前如果在第一頁,本來準(zhǔn)備播放的是第二頁,而這時(shí)候用戶滑動(dòng)到了末頁,
     * 則應(yīng)該播放的是第一頁,如果繼續(xù)按照原來的第二頁播放,則邏輯上有問題。
     */
    protected static final int MSG_PAGE_CHANGED = 4;
    // 輪播間隔時(shí)間
    protected static final long MSG_DELAY = 3000;
    // 使用弱引用避免Handler泄露.這里的泛型參數(shù)可以不是Activity,也可以是Fragment等
    private WeakReference<NewsHomeFragment> weakReference;
    private int currentItem = 0;
    // private boolean isOnce = true;
    protected ImageHandler(WeakReference<NewsHomeFragment> wk) {
      weakReference = wk;
    }
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      final NewsHomeFragment fragment = weakReference.get();
      if (fragment == null) {
        // Activity已經(jīng)回收,無需再處理UI了
        return;
      }
      // 第一次不刪重復(fù)的消息
      if (currentItem != 0) {
        // 檢查消息隊(duì)列并移除未發(fā)送的消息,這主要是避免在復(fù)雜環(huán)境下消息出現(xiàn)重復(fù)等問題。
        if (fragment.mHandler.hasMessages(MSG_UPDATE_IMAGE)) {
          fragment.mHandler.removeMessages(MSG_UPDATE_IMAGE);
        }
      }
      switch (msg.what) {
      case MSG_UPDATE_IMAGE:
        currentItem++;
        fragment.mViewPager.setCurrentItem(currentItem);
        // 準(zhǔn)備下次播放
        fragment.mHandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
        break;
      case MSG_KEEP_SILENT:
        // 只要不發(fā)送消息就暫停了
        break;
      case MSG_BREAK_SILENT:
        fragment.mHandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
        break;
      case MSG_PAGE_CHANGED:
        // 記錄當(dāng)前的頁號(hào),避免播放的時(shí)候頁面顯示不正確。
        int position = msg.arg1;
        int lastIndex = 0;
        int index = position % fragment.mImageList.size();
        for (int i = 0; i < fragment.mDotList.size(); i++) {
          fragment.mDotList.get(i).setBackgroundResource(R.drawable.dot_normal);
        }
        if (fragment.mDotList.get(index)!=null) {
          fragment.mDotList.get(index).setBackgroundResource(R.drawable.dot_red);
        }
        lastIndex = index;
        currentItem = position;
        break;
      default:
        break;
      }
    }
  }
}

三、布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".MainActivity" >
  <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="@dimen/news_pic_height" >
    <android.support.v4.view.ViewPager
      android:id="@+id/view_pager"
      android:layout_width="match_parent"
      android:layout_height="@dimen/news_pic_height" />
    <LinearLayout
      android:id="@+id/dotLayout"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:gravity="right|bottom"
      android:orientation="horizontal"
      android:background="@color/transparent_white_half"
      android:padding="8dp" >
      <View
        android:id="@+id/v_dot1"
        android:layout_width="@dimen/dot_width"
        android:layout_height="@dimen/dot_width"
        android:background="@drawable/dot_normal" />
      <View
        android:id="@+id/v_dot2"
        android:layout_width="@dimen/dot_width"
        android:layout_height="@dimen/dot_width"
        android:layout_marginLeft="5dp"
        android:background="@drawable/dot_red" />
    </LinearLayout>
  </RelativeLayout>
</LinearLayout>

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android布局layout技巧總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Android刮刮卡功能具體實(shí)現(xiàn)代碼

    Android刮刮卡功能具體實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android刮刮卡功能具體實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android APK 32位和64位的區(qū)別及說明

    Android APK 32位和64位的區(qū)別及說明

    這篇文章主要介紹了Android APK 32位和64位的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Android實(shí)現(xiàn)側(cè)滑菜單DrawerLayout

    Android實(shí)現(xiàn)側(cè)滑菜單DrawerLayout

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)側(cè)滑菜單DrawerLayout,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android?Jetpack組件ViewModel基本用法詳解

    Android?Jetpack組件ViewModel基本用法詳解

    這篇文章主要為大家介紹了Android?Jetpack組件ViewModel基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android實(shí)現(xiàn)View的拖拽

    Android實(shí)現(xiàn)View的拖拽

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)View的拖拽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 使用Android實(shí)現(xiàn)一個(gè)懸浮在軟鍵盤上的輸入欄

    使用Android實(shí)現(xiàn)一個(gè)懸浮在軟鍵盤上的輸入欄

    app開發(fā)中經(jīng)常會(huì)遇到一些輸入框要懸浮到軟鍵盤上方的需求,下面這篇文章主要給大家介紹了關(guān)于如何使用Android實(shí)現(xiàn)一個(gè)懸浮在軟鍵盤上的輸入欄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Android喚醒、解鎖屏幕代碼實(shí)例

    Android喚醒、解鎖屏幕代碼實(shí)例

    這篇文章主要介紹了Android喚醒、解鎖屏幕代碼實(shí)例,本文講解了喚醒、解鎖屏幕需要的權(quán)限和操作代碼實(shí)例,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
    2015-05-05
  • android 通知Notification詳解及實(shí)例代碼

    android 通知Notification詳解及實(shí)例代碼

    這篇文章主要介紹了android 通知Notification詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Android?廣播接收器BroadcastReceiver詳解

    Android?廣播接收器BroadcastReceiver詳解

    Android開發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù),本篇著重介紹廣播組件
    2022-07-07
  • 在Android TextView中顯示圖片的4種方式詳解

    在Android TextView中顯示圖片的4種方式詳解

    這篇文章主要介紹了在Android TextView中顯示圖片的4種方式,需要的朋友可以參考下
    2018-03-03

最新評(píng)論

湖南省| 成武县| 凤庆县| 临沧市| 大新县| 金寨县| 浙江省| 商洛市| 云梦县| 托克逊县| 龙胜| 周宁县| 江永县| 天津市| 雅安市| 法库县| 清远市| 施甸县| 民和| 新蔡县| 息烽县| 迁安市| 通辽市| 靖江市| 齐河县| 安达市| 崇左市| 获嘉县| 南通市| 交口县| 紫金县| 安顺市| 乡城县| 兴宁市| 富裕县| 云林县| 诏安县| 常州市| 石泉县| 拜城县| 合川市|