1. 程式人生 > >廣告輪播實現(ViewPager的實現)

廣告輪播實現(ViewPager的實現)

因部落格文章為自己菜鳥學習文章,沒有什麼功底,都是給自己瀏覽的,大神就誤入了,詳情見程式碼註釋 ;

1、開源架包無法關聯原始碼的兩種解決方式,建議選擇第二種簡單點:

        1、點選 Android Dependencies, 將其在BuildPath  remove 掉,再右擊點選jar包,將jar  add to BuildPath ,然後出現  Attatch 按鈕,開啟對話方塊,選擇External Folder,開啟SDK根目錄,extras ,android,support,V4 ,src 點選確定;

       2、在Libs目錄下建立一個資料夾,檔名是架包的全名,包括字尾.jar ,記得是全名,然後該檔名以加.properties 結尾,開啟檔案 會顯示 src="" , 依次開啟SDK根目錄,extras ->android->support->V4 ->src   的路徑拷貝進去 ,最後它會提示您要不要將“/”  改為 “//” ,點選修改,手動修改也可以,但是一定記得改;

2、 異常,匯入的類明明有,但執行的時候,顯示類異常,報 class not found異常,解決方案  ,右擊 開源架包,選擇Build path ,點選 Order  And Export ,將對應的jar包勾選即可;

3、設定單行引號 ,用ellipsize ;

4、ViewPager的實現:

         1.在佈局檔案中加入控制元件viewpager,這個元件,注意這個元件是用來顯示左右滑動的介面的,如果不載入xml佈局檔案,他是不會顯示內容的
        2.載入要顯示的頁卡
           3. 
viewpager元件設定一個page介面卡,它是基類提供介面卡來填充頁面ViewPager內部,你很可能想要使用一個更具體的實現,如                                                     FragmentPagerAdapter                  

FragmentStatePagerAdapter。
                        4.給viewpager新增OnPageChangeListener事件來實現切換的動畫等功能(這一步不是必須的)


介面佈局:主介面ContentLayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">
   <!--ViewPager是匯入外部的類,所以在引用的時候,要將路徑全新增進去-->
    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/ViewPager"
        ></android.support.v4.view.ViewPager>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#AA000000"
        android:layout_alignBottom="@id/ViewPager">
        <TextView
            android:id="@+id/tv_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:ellipsize="end"
            android:text="我是文字"
            android:textColor="#ffffff"
            android:textSize="16sp"
            android:layout_gravity="center_horizontal"/>
        <LinearLayout
             android:layout_marginTop="3dp"
            android:id="@+id/doc_Linearlayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_horizontal" ></LinearLayout>

    </LinearLayout>
    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@android:style/Widget.ProgressBar.Large"
        android:visibility="invisible"
        android:layout_centerInParent="true"/>

</RelativeLayout>
文字框下的兩個點佈局定義drawable資料夾內:

黑色圓點dots_unfocus

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color="#ffffff"/>
</shape>
白色圓點dots_focus
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
     <solid android:color="#AA000000"/>
</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/dot_focus"/>
    <item android:drawable="@drawable/unfocus_docs"/>
</selector>
主程式碼:

    

public class MainActivity extends AppCompatActivity {
     android.os.Handler handler=new android.os.Handler(){
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what){
                 case 1:
                     viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                     handler.sendEmptyMessageDelayed(1, 4000);
                     break;
                 default:
                     break;
             }
         }
     };
    private  ViewPager viewPager;
    private ImageView imageView;
    private ArrayList<Adbean>  arrayList;
    private TextView textView;
    private  LinearLayout docLayout;
    private  ProgressBar progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        initData();
        initListener();
        updateTextAndDocs();
    }
    private void initView() {
        setContentView(R.layout.activity_main);
        viewPager= (ViewPager) findViewById(R.id.ViewPager);
        textView= (TextView) findViewById(R.id.tv_text);
        docLayout= (LinearLayout) findViewById(R.id.doc_Linearlayout);
    }
    private void initData() {
        viewPager.setAdapter(new MyPagerApdater());
        arrayList=new ArrayList<Adbean>();
        arrayList.add(new Adbean(R.drawable.a,"鞏俐不低俗,我就不能低俗"));
        arrayList.add(new Adbean(R.drawable.b,"朴樹又回來了,再唱經典老歌,引萬人同唱"));
        arrayList.add(new Adbean(R.drawable.c, "殲滅北京電影"));
        arrayList.add(new Adbean(R.drawable.d, "樂視網TV版大放送"));
        arrayList.add(new Adbean(R.drawable.e, "熱血屌絲的反殺"));
        //在初始化資料之後再初始化點集
        initDocs();
        int currentValue=Integer.MAX_VALUE/2;
        //取出餘數
        int value=currentValue%arrayList.size();
        //設定顯示的動畫的position位置為最大值的中間,但是將其設定為剛好為 arrayListSize整除,這樣才能使得剛開始的位置為0
        viewPager.setCurrentItem(currentValue-value);
        progressBar= (ProgressBar) findViewById(R.id.progressBar);
        handler.sendEmptyMessageDelayed(1,4000);
    }
    private void initListener() {
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                updateTextAndDocs();
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }
    //更新文字
    private void updateTextAndDocs() {
        //獲取當前頁面的下標
        int currentPage=viewPager.getCurrentItem()%arrayList.size();
        //設定當前頁的文字
        textView.setText(arrayList.get(currentPage).getIntros());
        //設定當前頁的下方是顯示黑點還是白點,如果和頁面的下標一致則顯示 白點,其它黑點
        for (int i=0;i<docLayout.getChildCount();i++){
            docLayout.getChildAt(i).setEnabled(i == currentPage);
        }
    }
    private  void initDocs(){
        for(int i=0;i<arrayList.size();i++){
            View view=new View(this);
            //使用佈局引數設定View的寬高,和間距
            LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(8,8);
            view.setLayoutParams(params);
            if(i!=0){
                params.leftMargin=8;
            }
            view.setBackgroundResource(R.drawable.selector);
            docLayout.addView(view);
        }
    }
    class  MyPagerApdater extends PagerAdapter implements View.OnClickListener{
        @Override
        /**
         返回多少個Page
         */
        public int getCount() {
            return Integer.MAX_VALUE;
        }
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view==object;
        }
        /*
        類似於BaseAdapter的getView
        由於它只需要三個介面,無需ViewHolder
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view=View.inflate(getApplicationContext(), R.layout.image_ad, null);
            imageView= (ImageView) view.findViewById(R.id.iv_image);
            Adbean a=arrayList.get(position%arrayList.size());
            imageView.setImageResource(a.getImages());
            container.addView(view);
            view.setOnClickListener(MyPagerApdater.this);
            updateTextAndDocs();
            return view;
        }
        @Override
        /*
        銷燬page
        position:當前需要銷燬第幾個page
        object: 當親需要銷燬的page
         */
        public void destroyItem(ViewGroup container, int position, Object object) {
            //super.destroyItem(container, position, object);---此方法如果不定義,那麼返回的將是一個異常
            container.removeView((View) object);
        }
        //給page設定一個監聽器
        @Override
        public void onClick(View v) {


           Toast toast= Toast.makeText(getApplicationContext(), "資料正在載入,請稍後...", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER,0,0);
            toast.show();
            progressBar.setVisibility(ProgressBar.VISIBLE);
        }
    }
}