欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    覽安卓開發者官網的時候,發現google悄然推出了一個新的控件:ViewPager2 ,一看名稱就知道這是一個和我們常用的 ViewPager 功能相似的控件,算是ViewPager的升級版吧。目前還只是推出了第一個預覽版,我們可以直接引入來使用了:

    implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha04'
    

    我們先來看看有哪些功能和使用上的變化:https://developer.android.google.cn/jetpack/androidx/releases/viewpager2

    新功能:

    • 支持RTL布局
    • 支持豎向滾動
    • 完整支持notifyDataSetChanged

    API的變動:

    • FragmentStateAdapter替換了原來的 FragmentStatePagerAdapter
    • RecyclerView.Adapter替換了原來的 PagerAdapter
    • registerOnPageChangeCallback替換了原來的 addPageChangeListener
    • 看了上面這些介紹,有一點比較吸引人的就是支持豎向滾動了,這是怎么實現的呢?ViewPager2的源碼不長,我們來簡單分析一下。

    簡單解析

    通過查看源碼得知,ViewPager2是直接繼承ViewGroup的,意味著和ViewPager不兼容,類注釋上也寫了它的作用是取代ViewPager,不過短時間內ViewPager應該還不會被廢棄掉。

    繼續查看源碼,發現了兩個比較重要的成員變量:

     private RecyclerView mRecyclerView;
     private LinearLayoutManager mLayoutManager;
    

    所以很清楚得知,ViewPager2的核心實現就是RecyclerView+LinearLayoutManager了,因為LinearLayoutManager本身就支持豎向和橫向兩種布局方式,所以ViewPager2也能很容易地支持這兩種滾動方向了,而幾乎不需要添加任何多余的代碼。

    其實在此之前也不乏有大神采用RecyclerView來實現輪播圖效果的,具體實現發生略有不同,但大體思想是一致的。這次ViewPager2的推出意味著這種方法終于被扶正了。

    為了讓RecyclerView變得像原來的ViewPager,需要設置下SnapHelper:

     new PagerSnapHelper().attachToRecyclerView(mRecyclerView);
    

    熟悉RecyclerView的同學都知道,SnapHelper用于輔助RecyclerView在滾動結束時將Item對齊到某個位置。PagerSnapHelper的作用讓滑動結束時使當前Item居中顯示,并且 限制一次只能滑動一頁,不能快速滑動,這樣就和viewpager的交互很像了。

    另外和viewpager一樣,viewpager2可以承載fragment,我們需要繼承實現它提供的FragmentStateAdapter:

    public abstract class FragmentStateAdapter extends
     RecyclerView.Adapter<FragmentViewHolder> implements StatefulAdapter
    

    這是一個包含FragmentManager和數據狀態恢復功能的RecyclerView.Adapter,具體實現可以參看源碼。所以大家也可以用TabLayout+ViewPager2+Fragment來實現聯動展示效果。

    使用

    通過android:orientation來指定滾動方向

     <androidx.viewpager2.widget.ViewPager2
     android:id="@+id/viewpager2"
     android:layout_width="match_parent"
     android:layout_height="200dp"
     android:orientation="vertical" />
    

    在代碼中設置一個普通的RecyclerView.adapter:

     ViewPager2 viewPager2=findViewById(R.id.viewpager2);
     RecyclerviewAdapter adapter=new RecyclerviewAdapter(this);
     viewPager2.setAdapter(adapter);
    

    這樣豎直輪播圖就大功告成了。

    小結

    viewpager2利用recyclerview來實現viewpager的功能,無疑使使其可擴展性大大提升,代碼也變得更優雅簡潔,使用起來也更靈活。不過目前viewpager2只是第一個預覽版,還存在穩定性方面的問題,不建議大家引入到正式項目中來,嘗嘗鮮就好。

    想學習更多Android知識,或者獲取相關資料請關注我,并私信回復【資料】。 有面試資源系統整理分享,Java語言進階和Kotlin語言與Android相關技術內核,APP開發框架知識, 360°Android App全方位性能優化。Android前沿技術,高級UI、Gradle、RxJava、小程序、Hybrid、 移動架構師專題項目實戰環節、React Native、等技術教程!架構師課程、NDK模塊開發、 Flutter等全方面的 Android高級實踐技術講解。還有在線答疑

    iewPager類提供了多界面切換的新效果。新效果有如下特征:

    [1] 當前顯示一組界面中的其中一個界面。

    [2] 當用戶通過左右滑動界面時,當前的屏幕顯示當前界面和下一個界面的一部分。

    [3]滑動結束后,界面自動跳轉到當前選擇的界面中。

    引用ViewPager控件

    ViewPager來源于google 的補充組件android-support-v13.jar,位置在androidSDK文件夾android-sdk-windows\extras\android\compatibility\v13 下將android-support-v13.jar 引用到項目中

    下面我們用功能代碼來實現效果:

    @ MainActivity.java

    package cn.com.farsight;

    import java.util.ArrayList;

    import java.util.List;

    import android.app.Activity;

    import android.media.Image;

    import android.os.Bundle;

    import android.support.v4.view.PagerAdapter;

    import android.support.v4.view.ViewPager;

    import android.view.View;

    import android.view.ViewGroup;

    import android.widget.ImageView;

    public class MainActivity extends Activity {

    /* 先說明一下實現ViewPager的兩種形式。

    * 第一種導入第三方jar包,包的名字是android-support-v4.jar

    * 第二種就是應用功能性代碼直接實現,在開發當中這種方法已經不用了

    *

    * android-support-v4.jar在 android3.0 以后出現的。

    *

    * 我們只要用到adapter就要想到三個步驟:

    * 1.初始化控件;

    * 2.初始化數據源;

    * 3.初始化適配器,往適配器里填充數據。

    *

    * 首先在布局文件中。

    * 這里我們運用第三方的jar包,沒有提示功能,所以同學們要記住這屆jar包,在開發當中我們經常使用。

    *

    首先,如果繼承pageradapter,至少必須重寫下面的四個方法

    1. instantiateItem(ViewGroup, int)

    2. destroyItem(ViewGroup, int, Object)

    3. getCount()

    4. isViewFromObject(View, Object)

    *

    */

    private List list;

    private ViewPager mViewPager;

    private TestAdapter adapter;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    //new Thread()

    //初始化控件

    mViewPager=(ViewPager) findViewById(R.id.pager);

    //初始化數據源,把數據添加到list集合中,

    list=new ArrayList();

    ImageView iv1=new ImageView(this);

    iv1.setImageResource(R.drawable.huonv);

    list.add(iv1);

    ImageView iv2=new ImageView(this);

    iv2.setImageResource(R.drawable.shuiren);

    list.add(iv2);

    ImageView iv3=new ImageView(this);

    iv3.setImageResource(R.drawable.xuemo);

    list.add(iv3);

    /初始化適配器

    adapter=new TestAdapter();

    //連接數據與適配器,把數據顯示到adapter上

    mViewPager.setAdapter(adapter);

    }

    private class TestAdapter extends PagerAdapter{

    //計算頁卡數量

    // 獲取要滑動的控件的數量,在這里我們以滑動的頁卡為例,那么這里就應該是展示的頁卡圖片的ImageView數量

    @Override

    public int getCount() {//這個方法,是獲取當前窗體界面數

    // TODO Auto-generated method stub

    return list.size();//返回頁卡的數量

    }

    //而isViewFromObject方法是用來判斷pager的一個view是否和instantiateItem方法返回的object有關聯

    /* ViewPager源碼,你去看下addNewItem方法,會找到instantiateItem的使用方法,注意這里的mItems變量。

    * 然后你再搜索下isViewFromObject,會發現其被infoForChild方法調用,返回值是ItemInfo。再去看下ItemInfo的結構,

    * 其中有一個object對象,該值就是instantiateItem返回的。

    *

    *

    * 也就是說,ViewPager里面用了一個mItems(ArrayList)來存儲每個page的信息(ItemInfo),

    * 當界面要展示或者發生變化時,需要依據page的當前信息來調整,但此時只能通過view來查找,

    * 所以只能遍歷mItems通過比較view和object來找到對應的ItemInfo。

    *

    */

    // 來判斷顯示的是否是同一張圖片,這里我們將兩個參數相比較返回即可

    @Override

    public boolean isViewFromObject(View arg0, Object arg1) {

    // TODO Auto-generated method stub

    return arg0==arg1;

    }

    // PagerAdapter只緩存三張要顯示的圖片,如果滑動的圖片超出了緩存的范圍,就會調用這個方法,將圖片銷毀

    @Override

    public void destroyItem(ViewGroup container, int position, Object object) {

    //super.destroyItem(container, position, object);

    container.removeView(list.get(position));

    }

    //這個方法,return一個對象,這個對象表明了PagerAdapter適配器選擇哪個對象*放在當前的ViewPager中

    //這個方法用來實例化頁卡

    // 用這個方法當要顯示的圖片可以進行緩存的時候,會調進行顯示圖片的初始化,我們將要顯示的ImageView加入到ViewGroup中,然后作為返回值返回即可

    @Override

    public Object instantiateItem(ViewGroup container, int position) {

    container.addView(list.get(position));//添加頁卡

    return list.get(position);

    }

    }

    }

    布局文件

    @activity_main.xml

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity"

    <>

    android:id="@+id/pager"

    android:layout_width="fill_parent"

    android:layout_height="match_parent"/>


    這樣我們的ViewPager就介紹完了。希望你們能夠喜歡。

    嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!

    無償分享大家一個資料包,差不多150多G。里面學習內容、面經、項目都比較新也比較全!某魚上買估計至少要好幾十。加微信領取資料

    先是xml布局:

    <androidx.viewpager.widget.ViewPager    android:id="@+id/loopviewpager"    android:layout_width="match_parent"    android:layout_height="150dp" />

    主類:

    public class PushOfferActivity extends Activity {
        private ViewPager viewPager;  //輪播圖模塊    private int[] mImg;    private ArrayList<ImageView> mImgList;    private LinearLayout ll_dots_container;    private int previousSelectedPosition=0;//點的位置    boolean isRunning=false;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);        setContentView(R.layout.activity_push);        initLoopView();  //實現輪播圖    }
        private void initLoopView() {
            Point p=Common.getInstance().getRelSize();        int width=p.x;        viewPager=(ViewPager)findViewById(R.id.loopviewpager);        LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(width,width*4/5);        viewPager.setLayoutParams(params);        ll_dots_container=(LinearLayout)findViewById(R.id.ll_dots_loop);        // 圖片資源id數組        mImg=new int[]{
                    R.drawable.logo_1,                R.drawable.logo_2,                R.drawable.logo_3,        };        // 初始化要展示的5個ImageView        mImgList=new ArrayList<ImageView>();        ImageView imageView;        View dotView;        LinearLayout.LayoutParams layoutParams;        for(int i=0;i<mImg.length;i++){
                //初始化要顯示的圖片對象            imageView=new ImageView(this);            imageView.setBackgroundResource(mImg[i]);            mImgList.add(imageView);            //加引導點            dotView=new View(this);            dotView.setBackgroundResource(R.drawable.dot);            layoutParams=new LinearLayout.LayoutParams(15,15);            if(i!=0){
                    layoutParams.leftMargin=10;            }
                //設置默認所有都不可用            dotView.setEnabled(false);            ll_dots_container.addView(dotView,layoutParams);        }
    
            ll_dots_container.getChildAt(0).setEnabled(true);        previousSelectedPosition=0;        //設置適配器        viewPager.setAdapter(new LoopViewAdapter(mImgList));        // 開啟輪詢        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override            public void onPageScrolled(int i, float v, int i1) {
    
                }
                @Override            public void onPageSelected(int i) {
                    int newPosition=i % mImgList.size();                ll_dots_container.getChildAt(previousSelectedPosition).setEnabled(false);                ll_dots_container.getChildAt(newPosition).setEnabled(true);                previousSelectedPosition=newPosition;            }
    
                @Override            public void onPageScrollStateChanged(int i) {
    
                }
            });        new Thread(){
                public void run(){
                    isRunning=true;                while(isRunning){
                        try{
                            Thread.sleep(3000);                    } catch (InterruptedException e) {
                            e.printStackTrace();                    }
                        //下一條                    runOnUiThread(new Runnable() {
                            @Override                        public void run() {
                                if(viewPager.getCurrentItem()==mImgList.size()-1){
                                    viewPager.setCurrentItem(0);                            }else{
                                    viewPager.setCurrentItem(viewPager.getCurrentItem()+1);                            }
                            }
                        });                }
                }
            }.start();    }
    }
    

    適配器:

    private ArrayList<ImageView> imageViewList;public LoopViewAdapter(ArrayList<ImageView> mImgList) {
        imageViewList=mImgList;}
    // 1. 返回要顯示的條目內容, 創建條目@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {
        container.addView(imageViewList.get(position), 0);    return imageViewList.get(position);}
    
    @Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(imageViewList.get(position));}
    
    @Overridepublic int getCount() {
        return imageViewList.size();}
    
    @Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view==o;}

    這里我說有,網上有的說將getCount設置為無限大,這樣就能過實現輪播,我當時也試了,可以,但是?。。。。∵@個時候你反方向滑動就會出現崩潰?。。?!

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有