Android自定義控制項6--輪播圖廣告的實現

来源:http://www.cnblogs.com/wuyudong/archive/2016/09/29/5920757.html
-Advertisement-
Play Games

本文接著實現輪播圖廣告的監聽滾動 本文地址:http://www.cnblogs.com/wuyudong/p/5920757.html,轉載請註明源地址。 首先添加佈局文件,實現小白點 shape_bg_point_enable.xml shape_bg_point_disable.xml 再添加 ...


本文接著實現輪播圖廣告的監聽滾動

本文地址:http://www.cnblogs.com/wuyudong/p/5920757.html,轉載請註明源地址。

首先添加佈局文件,實現小白點

shape_bg_point_enable.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <corners android:radius="5dp" />
    <solid android:color="@android:color/white" />
</shape>

shape_bg_point_disable.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <corners android:radius="5dp" />
    <solid android:color="@android:color/darker_gray" />

</shape>

再添加一個selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_enabled="true" android:drawable="@drawable/shape_bg_point_enable"></item>
    <item android:state_enabled="false" android:drawable="@drawable/shape_bg_point_disable"></item>

</selector>

將selector添加到視圖:

        for (int i = 0; i < imageResIds.length; i++) {
            imageView = new ImageView(this);
            imageView.setBackgroundResource(imageResIds[i]);
            imageViewList.add(imageView);

            // 加小白點,指示器
            pointView = new View(this);
            pointView.setBackgroundResource(R.drawable.selector_bg_point);
            layoutParams = new LayoutParams(7, 7);
            if (i != 0) {
                layoutParams.leftMargin = 10;
            }
            pointView.setEnabled(false);

            ll_point_container.addView(pointView, layoutParams);
        }

為ViewPager添加滑動監聽

public class MainActivity extends Activity implements OnPageChangeListener 
......
    @Override
    public void onPageScrolled(int position, float positionOffset,
            int positionOffsetPixels) {
        // 滾動時調用
    }

    @Override
    public void onPageSelected(int position) {
        // 新條目被選中時調用
        position = position % 5;
        tv_desc.setText(contentDesc[position]);
        // 把之前的禁用,把最新的啟用
        ll_point_container.getChildAt(lastEnablePoint).setEnabled(false);
        ll_point_container.getChildAt(position).setEnabled(true);
        lastEnablePoint = position;
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        // 滾動狀態變化時調用

    }

開啟頁面自動輪詢:

        //開啟輪詢
        new Thread() {
            public void run() {
                while(isRunning) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //往下跳一位
                    runOnUiThread(new Runnable() {
                        
                        @Override
                        public void run() {
                            viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                        }
                    });
                }
                
            };
            
            
        }.start();

完整代碼如下:

package com.wuyudong.viewpager;

import java.util.ArrayList;

import android.R.layout;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

public class MainActivity extends Activity implements OnPageChangeListener {

    private ViewPager viewPager;
    private int[] imageResIds;
    private ArrayList<ImageView> imageViewList;
    private ArrayList<View> pointViews;
    private LinearLayout ll_point_container;
    private String[] contentDesc;
    private TextView tv_desc;
    private int lastEnablePoint = 0;
    private boolean isRunning = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化佈局 View 視圖
        initViews();

        // Model 數據
        initData();

        // Controller 控制器
        initAdapter();
        
        //開啟輪詢
        new Thread() {
            public void run() {
                while(isRunning) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //往下跳一位
                    runOnUiThread(new Runnable() {
                        
                        @Override
                        public void run() {
                            viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                        }
                    });
                }
                
            };
            
            
        }.start();

    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        isRunning = false;
    }

    private void initViews() {
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setOnPageChangeListener(this);// 設置滾動更新

        tv_desc = (TextView) findViewById(R.id.tv_desc);

        ll_point_container = (LinearLayout) findViewById(R.id.ll_point_container);

    }

    private void initAdapter() {
        ll_point_container.getChildAt(0).setEnabled(true);
        tv_desc.setText(contentDesc[0]);
        // 設置適配器
        viewPager.setAdapter(new MyAdapter());
        
        //預設設置到中間的某個位置
        int pos = Integer.MAX_VALUE / 2;
        //viewPager.setCurrentItem(pos - 3);
        viewPager.setCurrentItem(5000000);
    }

    private void initData() {

        // 初始化要顯示的數據
        // 圖片資源id數組
        imageResIds = new int[] { R.drawable.a, R.drawable.b, R.drawable.c,
                R.drawable.d, R.drawable.e };
        // 文本描述
        contentDesc = new String[] { "鞏俐不低俗,我就不能低俗", "樸樹又回來啦!再唱經典老歌引萬人大合唱",
                "揭秘北京電影如何升級", "樂視網TV版大派送", "熱血屌絲的反殺" };
        imageViewList = new ArrayList<ImageView>();
        pointViews = new ArrayList<View>();
        ImageView imageView;
        View pointView;
        LayoutParams layoutParams;
        for (int i = 0; i < imageResIds.length; i++) {
            imageView = new ImageView(this);
            imageView.setBackgroundResource(imageResIds[i]);
            imageViewList.add(imageView);

            // 加小白點,指示器
            pointView = new View(this);
            pointView.setBackgroundResource(R.drawable.selector_bg_point);
            layoutParams = new LayoutParams(7, 7);
            if (i != 0) {
                layoutParams.leftMargin = 10;
            }
            pointView.setEnabled(false);

            ll_point_container.addView(pointView, layoutParams);
        }

    }

    class MyAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        // 3、指定復用的判斷邏輯
        @Override
        public boolean isViewFromObject(View view, Object object) {
            // 當滑到新的條目,又返回來,view是否可以被覆用
            return view == object;
        }

        // 1、返回要顯示的條目內容,創建條目
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // container:容器:ViewPager
            // position:當前要顯示的條目的位置
            position = position % 5;
            ImageView imageView = imageViewList.get(position);
            System.out.println("instantItem創建:" + position);
            // a、把view對象添加到container中
            container.addView(imageView);
            // b、把view對象返回給框架,適配器
            return imageView; // 必須要重寫,否則拋異常
        }

        // 2、銷毀條目
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // object 要銷毀的對象
            System.out.println("destroyItem銷毀:" + position);
            container.removeView((View) object);
        }

    }

    @Override
    public void onPageScrolled(int position, float positionOffset,
            int positionOffsetPixels) {
        // 滾動時調用
    }

    @Override
    public void onPageSelected(int position) {
        // 新條目被選中時調用
        position = position % 5;
        tv_desc.setText(contentDesc[position]);
        // 把之前的禁用,把最新的啟用
        ll_point_container.getChildAt(lastEnablePoint).setEnabled(false);
        ll_point_container.getChildAt(position).setEnabled(true);
        lastEnablePoint = position;
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        // 滾動狀態變化時調用

    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GPUIMAGE中GPUImageStillCamera可以調用系統相機,並實現實時濾鏡,但是我沒有找到相機全屏的方法,望知道的說一下 GPUImageStillCamera繼承自GPUImageVideoCamera類,添加了捕獲照片的功能。 GPUImageVideoCamera 初始化方法: ...
  • 本文實現全自定義控制項--自定義開關 本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,轉載請註明源地址。 自定義開關 (View),本文完成下麵內容 1. 寫個類繼承View2. 拷貝包含包名的全路徑到xml中3. 界面中找到該控制項, 設置初始信 ...
  • Android Studio增量升級什麼情況下使用最合適呢? 比如現在的as版本是2.2版本,而你的as版本2.0版本,這個時候點Check For Updates就沒有反應了,因為你已經2個有版本沒升級了(版本跨度太大 ),所以這樣就不能線上升級了。 重要的信息 谷歌更新地址:https://dl ...
  • 最近在看推送方面的知識,用的是信鴿推送主要是因為後臺用的是信鴿 推送用第三方推送,也就是在客戶端建一個廣播接收器,當伺服器發送消息時發送到信鴿,信鴿再發送一次,廣播接受器接受下; 我實現的功能比較簡單,當app在運行狀態時,會在主頁展示一個彈窗展示推送的消息;如果app不在運行狀態且service沒 ...
  • 作為一個碼農,什麼都不用多講,貼代碼 build project build module Application public class App extends Application { private AppComponent appComponent; @Override public v ...
  • 首先要是在真機上查看android資料庫文件必須要取得root許可權,這裡怎麼獲取就不在多說。可能是手機的原因,本人獲取到的手機許可權如下: 雖然data目錄下的許可權已經開放,可是data下的包許可權卻未獲取到write許可權,基於這種情況解決方法如下: 通過命令行獲取到該包的許可權,可以看到目前該包許可權已經 ...
  • 使用與iOS8 以後,只是把系統的UIAlertController進行了封裝,省的每次用的時候要寫很多的代碼。封裝後只需要一句代碼即可 , deome 地址:https://github.com/liguoliangiOS/LGLAlertView.git 上代碼LGLAlertView.h: L ...
  • 關於應用之間的相互操作,小編一直覺得非常高大上,在一次面試中被面試官一頓暴虐,今天小編就決定學習一下!經過一頓度娘,找到一些博客,不過都比較凌亂,我就打算自己整理一下! 首先要說的是每一個APP都可以設置一個自己獨有的URL,APP應用之間的操作就是通過這個URL來實現的! 1、如何配置自己應用的U ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...