androidviewpager引導
❶ Android-ViewPager2
ViewPager2
簡單說就是將RecycleView再封裝了一遍,然後協同FragmentStateAdapter將RecycleView的每個Item與Fragment綁定。
特性
支持從左到右,或者從上到下布局
由於適配基於的是RecyclerView.Adapter,所以內存優化也直接採用RecyclerView.Adapter的內存優化機制,相對於viewpager,內存優化更高效合理,且notifyDataSetChanged也更高效了。由於不用開發者自己實現內存和notifyDataSetChanged,也更簡便了。
相比ViewPager,ViewPager2修復了不能關閉預載入和更新Adapter不生效的痛點。
目前ViewPager2對Fragment支持只能用FragmentStateAdapter,FragmentStateAdapter在遇到預載入時,只會創建Fragment對象,不會把Fragment真正的加入到布局中,所以自帶懶載入效果。
FragmentStateAdapter不會一直保留Fragment實例,回收的ItemView也會移除Fragment,所以得做好Fragment重建後恢復數據的准備。
FragmentStateAdapter在遇到offscreenPageLimit>0時,處理離屏Fragment和可見Fragment沒有什麼區別,所以無法通過setUserVisibleHint判斷顯示與否。
基本方法
部分核心方法使用參照RecycleView和ViewPager,如設置分割線addItemDecoration(),設置當前項setCurrentItem()等。
setAdapter() 設置適配器
setOrientation() 設置布局方向
setCurrentItem() 設置當前Item下標
beginFakeDrag() 開始模擬拖拽
fakeDragBy() 模擬拖拽中
endFakeDrag() 模擬拖拽結束
setUserInputEnabled() 設置是否允許用戶輸入/觸摸
setOffscreenPageLimit()設置屏幕外加皮櫻載頁面數量
registerOnPageChangeCallback() 注冊頁面改變回調
setPageTransformer() 設置頁面滑動時的變換效果
。。。還有好多。使用的時候大家可以具體看一下。
offscreenPageLimit()
不設置它則不會預載入,一旦設置了,由於limit必須>0,所以會進行預載入limit個頁面
viewpager2的預載入在載入時已經准備好了View布局,但是沒有載入到parent視圖上,所以自帶懶載入效果。 而viewpager載入的時候View已經添加到parent上。所以會走生命周期的方法。
從 初始化 方法可以看出,viewpager2支持的一些特性以及燃漏叢為什麼。
RecyclerViewImpl
基於RecyclerView的二次封裝,對觸摸事件,初搜褲始化等進行封裝。
LinearLayoutManagerImpl
使用LinearLayoutManager,所以擁有LinearLayoutManager的特性,可以垂直或者水平。也就引申出為什麼後面可以設置水平或者垂直滑動
PageTransformerAdapter
用於監聽pager的改變。
基於 RecyclerView.Adapter實現
類似recycleView的使用。
基於FragmentStateAdapter實現
❷ Android 解決viewPager中嵌套webView的滑動沖突
在工作中遇到了一種情況,在可以橫向滑動的viewPager其中的一項中嵌套著一個webView,並且在這個webView中也有可以橫向滑動的的類似viewPager的組件,因為webView其中的H5組件我們是無法控制的,因此便會發生滑動沖突,現象則是webView中的H5組件無法滑動。比如下圖
經過筆者的一陣搜索,借鑒了 Viewpager與webview滑動沖突的解決方案 一文的解決方案,並在其基礎上改進了一下,使之處理起來更加簡單一些。
首先我們先確定滑動沖突是事件分發機制的事情。解決辦法需要在需要的地方進行事件的攔截和分發可以使用下面的方法
當為true的時候則說明父控制項(也就是viewPager)不攔截事件,點擊事件由子控制項(也就是webView)來處理,反之為false的時候,父控制項則攔截點擊事件,子控制項無法響應點擊事件。
此時我們需要Android原生和JS交互一下,來通知我們什麼時候攔截事件,什麼時候不攔截事件。首先我們要先和H5的小夥伴商量好方法名和參數,在H5中可以監聽到是否點擊了或者滑動了輪播圖,H5的小夥伴可以在監聽值判斷,如果點擊或者滑動了H5中的輪播圖則,調用Android原生的方法參數為true,Android端則進行事件的攔截,反之沒有點擊或者滑動的時候,則調用方法參數為false。
交互方法:
如果有不懂Android原生與H5交互方法的可以看我的一篇文章 <Android中webveiw與H5進行交互>
此時我們拿到參數以後就可以進行事件的攔截
這樣就可以對事件分發進行處理,不過此處需要注意的是攔截事件的方法 wb.(isIntercept);必須要寫在Touch事件中才可以生效,寫在webview初始化的地方是不可以的。
ok,筆者認為這種方法比H5端去測量輪播圖的位置,然後告訴Android端,Android端再去判斷位置去攔截事件要簡單一些。當然這只是個人想法,還是要感謝借鑒文章的大佬,畢竟是站在了巨人的肩膀上。
❸ android viewpager怎麼用
一. 導入ViewPager第三方jar包android-support-v13.jar
在開發之前先在已經創建好的應用程序工程中導入jar包,方法如下:
選中應用程序工程,在eclipse的菜單欄選擇Project->properties->java Build Path->Libraries->Add External Jars中加入已經下載好的jar包。加入這個jar包之後就可以使用ViewPager類來開發相關的應用了。
舉一反三,其它第三方jar包的添加應該也是走這個步驟。
二. ViewPager的使用
下面以一個簡單的demo來實現ViewPager的使用,該Demo的效果圖如下:
該Demo總共四個頁面,每個頁面用一個Fragment來實現,所以分別創建FirstFragmentPage、SecondFragmentPage、ThirdFragmentPage、ForthFragmentPage四個類來實現四個頁面,這個四個類都繼承Fragment。這四個Fragment將在MainActivity中添加處理。以下主要代碼實現:
1. 主布局文件main.xml代碼如下:
[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<!-- ViewPager界面布局 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="50dip" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<!-- 指示圖標和按鈕的布局 -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical" >
<!-- ViewPager界面下方的指示翻頁圖標 -->
<LinearLayout
android:id="@+id/indicator_group"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dip"
android:gravity="center"
android:orientation="horizontal" >
</LinearLayout>
<!-- 底部的後退和前進按鈕布局 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="30dip"
android:paddingRight="30dip" >
<Button
android:id="@+id/back_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/back" />
<Button
android:id="@+id/next_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/next" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
2. MainActivity:
[java] view plain
package com.stevenhu.vpt;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class MainActivity extends Activity implements OnClickListener
{
private final static String TAG = "MainActivity";
private ViewPager mViewPager;
private ViewPagerAdapter mViewPagerAdapter;
private LinearLayout mIndicatorGroup;
//定義指示翻頁圖標數組
private ImageView[] mIndicatorImage;
private Button mBackButton, mNextButton;
//定義當前在第幾頁
private int mCurrentPage = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mViewPager = (ViewPager)findViewById(R.id.viewpager);
//創建自定義的ViewPagerAdapter對象
mViewPagerAdapter = new ViewPagerAdapter(this, mViewPager);
//添加Fragment
mViewPagerAdapter.addFragment(FirstFragmentPage.class, null);
mViewPagerAdapter.addFragment(SecondFragmentPage.class, null);
mViewPagerAdapter.addFragment(ThirdFragmentPage.class, null);
mViewPagerAdapter.addFragment(ForthFragmentPage.class, null);
//獲取指示器圖標所在界面布局對象
mIndicatorGroup = (LinearLayout)findViewById(R.id.indicator_group);
mIndicatorImage = new ImageView[mViewPagerAdapter.getCount()];
mBackButton = (Button)findViewById(R.id.back_button);
mNextButton = (Button)findViewById(R.id.next_button);
mBackButton.setOnClickListener(this);
mNextButton.setOnClickListener(this);
initIndicator();
}
//初始化指示器,實現隨著創建頁數的增加從而添加相應個數的指示圖標。
private void initIndicator()
{
for (int i = 0; i < mViewPagerAdapter.getCount(); i ++)
{
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(20,20));
imageView.setPadding(20, 0, 20, 0);
if (i == 0)
{
imageView.setBackgroundResource(R.drawable.page_indicator_focused);
}
else
{
imageView.setBackgroundResource(R.drawable.page_indicator);
}
mIndicatorImage[i] = imageView;
mIndicatorGroup.addView(mIndicatorImage[i]);
}
}
http://blog.csdn.net/stevenhu_223/article/details/8024925
❹ android怎麼viewpager實現循環切換圖片
Android中的ViewPager則實現了左右滑動的效果,ViewPager類提供了多界面切換的新效果。利用ViewPager實現圖片循環滾動代碼如下:
1、首先是布局文件,使用了一個ViewPager控制項:
<spanstyle="padding:0px;margin:0px;font-size:14px;"><RelativeLayoutxmlns: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.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dip">
<TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="第一個引導頁面"
android:textColor="@android:color/white"
android:textSize="14sp"/>
<LinearLayout
android:id="@+id/ll_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
</RelativeLayout></span>
2、接下來實現一個繼承PagerAdapter的MyAdapter類,實現一個PagerAdapter,代碼如下:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.List;
importandroid.support.v4.view.PagerAdapter;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
{
privateList<ImageView>mImageViewList;
publicViewPagerAdapter(List<ImageView>imageViewList){
super();
this.mImageViewList=imageViewList;
}
/**
*該方法將返回所包含的Item總個數。為了實現一種循環滾動的效果,返回了基本整型的最大值,這樣就會創建很多的Item,
*其實這並非是真正的無限循環。
*/
@Override
publicintgetCount(){
returnInteger.MAX_VALUE;
}
/**
*判斷出去的view是否等於進來的view如果為true直接復用
*/
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;
}
/**
*銷毀預載入以外的view對象,會把需要銷毀的對象的索引位置傳進來,就是position,
*因為mImageViewList只有五條數據,而position將會取到很大的值,
*所以使用取余數的方法來獲取每一條數據項。
*/
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
container.removeView(mImageViewList.get(position%mImageViewList.size()));
}
/**
*創建一個view,
*/
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){
container.addView(mImageViewList.get(position%mImageViewList.size()));
returnmImageViewList.get(position%mImageViewList.size());
}
}
</span>
3、最後是主界面部分的代碼:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.os.SystemClock;
importandroid.support.v4.view.ViewPager;
importandroid.support.v4.view.ViewPager.OnPageChangeListener;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.LinearLayout.LayoutParams;
importandroid.widget.TextView;
{
privateList<ImageView>imageViewList;
privateTextViewtvDescription;
privateLinearLayoutllPoints;
privateString[]imageDescriptions;
=0;
privateViewPagermViewPager;
privatebooleanisLoop=true;
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1);
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setView();
initView();
}
publicvoidsetView(){
setContentView(R.layout.activity_splash_viewpager);
//自動切換頁面功能
newThread(newRunnable(){
@Override
publicvoidrun(){
while(isLoop){
SystemClock.sleep(2000);
handler.sendEmptyMessage(0);
}
}
}).start();
}
publicvoidinitView(){
mViewPager=(ViewPager)findViewById(R.id.viewpager);
tvDescription=(TextView)findViewById(R.id.tv_image_description);
llPoints=(LinearLayout)findViewById(R.id.ll_points);
prepareData();
ViewPagerAdapteradapter=newViewPagerAdapter(imageViewList);
mViewPager.setAdapter(adapter);
mViewPager.setOnPageChangeListener(this);
tvDescription.setText(imageDescriptions[previousSelectPosition]);
llPoints.getChildAt(previousSelectPosition).setEnabled(true);
/**
*2147483647/2=1073741820-1
*設置ViewPager的當前項為一個比較大的數,以便一開始就可以左右循環滑動
*/
intn=Integer.MAX_VALUE/2%imageViewList.size();
intitemPosition=Integer.MAX_VALUE/2-n;
mViewPager.setCurrentItem(itemPosition);
}
privatevoidprepareData(){
imageViewList=newArrayList<ImageView>();
int[]imageResIDs=getImageResIDs();
imageDescriptions=getImageDescription();
ImageViewiv;
Viewview;
for(inti=0;i<imageResIDs.length;i++){
iv=newImageView(this);
iv.setBackgroundResource(imageResIDs[i]);
imageViewList.add(iv);
//添加點view對象
view=newView(this);
view.setBackgroundDrawable(getResources().getDrawable(R.drawable.point_background));
LayoutParamslp=newLayoutParams(5,5);
lp.leftMargin=10;
view.setLayoutParams(lp);
view.setEnabled(false);
llPoints.addView(view);
}
}
privateint[]getImageResIDs(){
returnnewint[]{
R.drawable.bg1,
R.drawable.bg2,
R.drawable.bg3,
R.drawable.pic_01,
R.drawable.pic_02
};
}
privateString[]getImageDescription(){
returnnewString[]{
"第一個引導頁面",
"第二個引導頁面",
"第三個引導頁面",
"第四個引導頁面",
"第五個引導頁面"
};
}
@Override
(intarg0){
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageSelected(intposition){
//改變圖片的描述信息
tvDescription.setText(imageDescriptions[position%imageViewList.size()]);
//切換選中的點,把前一個點置為normal狀態
llPoints.getChildAt(previousSelectPosition).setEnabled(false);
//把當前選中的position對應的點置為enabled狀態
llPoints.getChildAt(position%imageViewList.size()).setEnabled(true);
previousSelectPosition=position%imageViewList.size();
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
isLoop=false;
}
}
</span>
❺ Android軟體怎麼加一個引導界面
首先,打開eclipse,建立一個空的項目。
我們需要的資源:
1. 找幾張圖片(以4張為例,這個可以自己決定),分別命名:guide_page1.png、guide_page2.png、guide_page3.png、guide_page4.png。
2. 再找一個button的按鈕,類似網路地圖上的最後一個「進入地圖」按鈕。命名為:start_btn.png。
3. 兩種dot: 。分別命名:guide_dot_focus.png、guide_dot_normal.png。
將以上資源放到res/drawable-hdpi文件夾下(以上資源均在下方源碼下載中):
運行,就能出現開始的效果了。