Android之ViewPager 第一課

来源:http://www.cnblogs.com/xiaotaoqi/archive/2016/10/25/5996742.html
-Advertisement-
Play Games

想要瞭解Android新版本的的新特性,從頭開始吧,這是Android3.0新加入的widget,以前也接觸過,但是沒有好好的研究過,今天寫了一個小程式,研究一下ViewPager。 這個程式是支持左右滑動的View,核心是ViewPager。講解都在註釋中進行。 代碼如下: MainActivit ...


    想要瞭解Android新版本的的新特性,從頭開始吧,這是Android3.0新加入的widget,以前也接觸過,但是沒有好好的研究過,今天寫了一個小程式,研究一下ViewPager。

    這個程式是支持左右滑動的View,核心是ViewPager。講解都在註釋中進行。

   代碼如下:

   MainActivity.java:

package com.android3;


import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;




public class MainActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener {
    private ViewPager viewPager;
    private ArrayList<View> viewList;
    private List<String> titleList;
    private MyPagerAdapter adapter;
    private ImageView cursor;
    private LinearLayout titleBar;
    private float cursorW= 0;
    private float offset = 0;
    private float currentIndex = 0;
    private float screenW = 0;
    private float currentX = 0;
    private float fScreenW;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initToolbar();
        initViewPager();
    }

    /**
     * ViewPager 保證 緩存中存在三個視圖,即 左邊 右邊 和中間 隔一個的灰被destroy,
     */
    @SuppressLint("InflateParams")
    private void initViewPager() {
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        titleBar = (LinearLayout) findViewById(R.id.titleBar);
        LayoutInflater inflater = getLayoutInflater();
        //創建四個View
        View view1 = inflater.inflate(R.layout.viewpage_01, null);
        View view2 = inflater.inflate(R.layout.viewpage_02, null);
        View view3 = inflater.inflate(R.layout.viewpage_03, null);
        View view4 = inflater.inflate(R.layout.viewpage_04, null);

        viewList = new ArrayList<>();// 將要分頁顯示的View裝入數組中
        viewList.add(view1);
        viewList.add(view2);
        viewList.add(view3);
        viewList.add(view4);
        adapter = new MyPagerAdapter(viewList);
        titleList = new ArrayList<>();
        titleList.add("第一頁面");
        titleList.add("第二頁面");
        titleList.add("第三頁面");
        titleList.add("第四頁面");
        for (int i = 0; i < titleList.size(); i++) {
            TextView textView = new TextView(this);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            params.weight = 1;
            params.setMargins(5, 3, 5, 3);
            textView.setLayoutParams(params);
            textView.setText(titleList.get(i));
            textView.setTextSize(15);
            textView.setGravity(Gravity.CENTER);
            titleBar.addView(textView);
        }

        initCursorPos();   //初始化指示器位置

        viewPager.setAdapter(adapter);//綁定適配器
        viewPager.addOnPageChangeListener(this); //註 : setOnPageChangeListener 過時
    }

    /**
     *  單位px
     */
    public void initCursorPos() {
        // 初始化動畫
        cursor = (ImageView) findViewById(R.id.cursor);
        cursorW= BitmapFactory.decodeResource(getResources(), R.mipmap.cursor).getWidth();// 獲取圖片寬度
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        screenW = dm.widthPixels;// 獲取解析度寬度
        fScreenW=screenW / viewList.size();
        offset = (fScreenW - cursorW) / 2;// 計算偏移量
        Matrix matrix = new Matrix();
        matrix.postTranslate(offset, 0);
        cursor.setImageMatrix(matrix);// 設置動畫初始位置   ###原始位置
        currentX = offset;
    }

    private void initToolbar() {
        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
        Button btnRight = (Button) mToolbar.findViewById(R.id.btnRight);
        mToolbar.setTitle("");
        mToolbar.setNavigationIcon(R.mipmap.back);
        setSupportActionBar(mToolbar);
        mToolbar.setNavigationOnClickListener(this);
        btnRight.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case -1:
                finish();
                break;
            case R.id.btnRight:
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
                break;
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

  
    @Override
    public void onPageSelected(int position) {
        float X=fScreenW*position; //在此頁面中,滑塊位置和原始位置的距離
        //currentX 當前位置和原始位置的距離
        TranslateAnimation animation = new TranslateAnimation(currentX, X, 0, 0);
        /**
         *  public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
         *  throw new RuntimeException("Stub!");
         * }
         * 在X軸方向:
         * fromXDelta  動畫從原始位置+fromXDelta開始
         * 
         * toXDelta   動畫從原始位置+toXDelta結束
         * 
         *  在Y軸方向:
         * fromYDelta  動畫從原始位置+fromYDelta開始
         *
         * toYDelta   動畫從原始位置+toYDelta結束
         * 
         * 
         */
        currentX=fScreenW*position;//更新當前位置
        currentIndex = position;//保存上一個View編號
        animation.setFillAfter(true);//保存動畫
        animation.setDuration(300);//動畫持續時間
        cursor.startAnimation(animation);//開始
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
}

 

 

 MyPagerAdapter.java

package com.android3;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 *
 * Created by Administrator on 2016/10/25.
 */

public class MyPagerAdapter extends PagerAdapter {
   private List<View> list=null;
    //通過構造函數將裝有View的集合傳入適配器
    MyPagerAdapter(List<View> list){
        this.list=list;
    }

    /**
     *
     * @return 將要顯示的View的總個數
     */
    @Override
    public int getCount() {
        return list.size();
    }

    /**
     *
     * 該方法  判斷Key與View是否是正確的映射關係
     *
     * 而且在同一個容器中不能有相同的key傳入,否則行為會錯亂
     * @param view
     * @param object
     * @return
     */
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view==object;
    }

    /**
     * 因為ViewPager 容器中只保存當前位置的View和相鄰的View,當在容器中的View的編號位置距離當前位置超過1,
     * 就對該View進行移除
     * @param container 容器
     * @param position  即將失去的View位置
     * @param object
     */
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(list.get(position));
    }

    /**
     *
     * 首先判斷當前位置的左右view是否在容器中,如果不在,則調用instantiateItem方法將相鄰的view(之前不在容器中)加入容器中;
     * 返回此View,作為映射的Key
     *
     * @param container 容器
     * @param position  位置 從0開始
     * @return  view對應的Key
     */
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(list.get(position));
        return list.get(position);
    }
}

 

  

  activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.android3.MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary">

        <TextView
            android:id="@+id/tv_toolbar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/title"
            android:textColor="#ffffff"
            android:textSize="14sp"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btnRight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:layout_marginRight="10dp"
            android:text="@string/submit"
            android:textColor="#ffffff"
            android:textSize="12sp"
            android:textStyle="bold" />
    </android.support.v7.widget.Toolbar>

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbar"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/titleBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorAccent"
            android:orientation="horizontal" />

        <ImageView
            android:id="@+id/cursor"
            android:layout_width="match_parent"
            android:layout_height="5dp"
            android:scaleType="matrix"
            android:src="@mipmap/cursor" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"/>
    </LinearLayout>

</RelativeLayout>

 

  viewPager_01.xml

<?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="match_parent"
    android:background="#ffffff"
    android:orientation="vertical">
</LinearLayout>

  viewpager_02.xml,viewpager_03.xml,viewpager_04.xml  (略)只是背景顏色不同.

 

代碼下載http://download.csdn.net/detail/qq_25059501/9664066

     

作者: 小淘氣兒

出處: http://www.cnblogs.com/xiaotaoqi/p/5996742.html/>

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出.


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

-Advertisement-
Play Games
更多相關文章
  • 最近太忙了,一直沒時間 寫博客,項目基本搞完了,這幾天沒事多寫幾篇博客。歡迎加群交流iOS技術,QQ交流群:45992174。 剛裝的xcode8,不知道從哪來的一堆log 去除方法:Xcode8 >Product Edit Scheme... -> Run -> Arguments, 在Envir ...
  • 在這裡只粘貼部分代碼 在第一課中,只有View滑動完畢,才觸發動畫效果,令滑塊移動,在第二課中,將實現滑塊與View同步運行。 SecondActivity.java 下麵詳細介紹ViewPager.OnPageChangeListener監聽器的三個重寫方法: 當從手指按下,到頁面滑動停止的過程: ...
  • 有一種方法可以阻止父層的View截獲touch事件,就是調用 getParent().requestDisallowInterceptTouchEvent(true);方法。一旦底層View收到touch的 action後調用這個方法那麼父層View就不會再調用onInterceptTouchEve ...
  • 在學校開課學習了android的一些簡單的UI組件,佈局,四大組件學習了2個,數據存儲及網路通信,都是一些簡單的概念,入門而已。許多東西需要自己去學習。 學習一下 Android開發環境的搭建,兩種方式開發:一種是Eclipse,另一種是Android Studio。 Eclipse 一、下載and ...
  • 1. JSONObject對象的optXXX和getXXX的區別? getInt("key") 取值 不存在 或者類型不對 報錯optInt("key") 取值 不存在 返回預設值 getDouble("key") 取值 不存在 或者類型不對 報錯optDouble("key",0) 取值 不存在 ...
  • 在Android 4.4系統中,外置存儲卡(SD卡)被稱為二級外部存儲設備(secondary storage),應用程式已無法往外置存儲卡(SD卡)寫入數據,並且WRITE_EXTERNAL_STORAGE只為設備上的主要外部存儲(primary storage)授予寫許可權,對於其他外部存儲,其上 ...
  • 滿網都是微信小程式,技術dog們不關註都不行了。先別忙著去學怎麼開發小程式,先糾正一下你對微信小程式的三觀吧~~~~ 小程式目前被炒得沸沸揚揚,無數媒體和企業藉機獲取閱讀流量。 這再次證明一點,微信想讓什麼火,真的就能讓什麼火。 先列出8個多數人都搞錯的問題: 以上8個是很多人憑直覺得出的結論,但真 ...
  • 關於Retrofit+OkHttp的強大這裡就不多說了,還沒瞭解的同學可以自行去百度。這篇文章主要講如何利用Retrofit+OkHttp來實現一個較為簡單的緩存策略:即有網環境下我們請求數據時,如果沒有緩存或者緩存過期了,就去伺服器拿數據,並且將新緩存保存下來,如果有緩存而且沒有過期,則直接使用緩 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...