1. 程式人生 > >Android app引導頁(背景圖片切換加各個頁面動畫效果)

Android app引導頁(背景圖片切換加各個頁面動畫效果)

先看效果圖:


轉自:http://blog.csdn.net/lowprofile_coding/article/details/48037095

1.顯示三個頁面的Activity  用view pager去載入三個fragment實現,控制點點點的切換,監聽view pager的切換,控制fragment動畫的開始跟結束,重寫了view pager,實現了背景圖片的移動效果.

/**
 * 主Activity
 * @author ansen
 * @create time 2015-08-07
 */
public class KaKaLauncherActivity extends FragmentActivity {
	private GuideViewPager vPager;
	private List<LauncherBaseFragment> list = new ArrayList<LauncherBaseFragment>();
	private BaseFragmentAdapter adapter;

	private ImageView[] tips;
	private int currentSelect; 
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_luancher_main);
		
		//初始化點點點控制元件
		ViewGroup group = (ViewGroup)findViewById(R.id.viewGroup);
		tips = new ImageView[3];
		for (int i = 0; i < tips.length; i++) {
			ImageView imageView = new ImageView(this);
			imageView.setLayoutParams(new LayoutParams(10, 10));
			if (i == 0) {
				imageView.setBackgroundResource(R.drawable.page_indicator_focused);
			} else {
				imageView.setBackgroundResource(R.drawable.page_indicator_unfocused);
			}
			tips[i]=imageView;

			LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
			layoutParams.leftMargin = 20;//設定點點點view的左邊距
			layoutParams.rightMargin = 20;//設定點點點view的右邊距
			group.addView(imageView,layoutParams);
		}
		
		//獲取自定義viewpager 然後設定背景圖片
		vPager = (GuideViewPager) findViewById(R.id.viewpager_launcher);
		vPager.setBackGroud(BitmapFactory.decodeResource(getResources(),R.drawable.bg_kaka_launcher));

		/**
		 * 初始化三個fragment  並且新增到list中
		 */
		RewardLauncherFragment rewardFragment = new RewardLauncherFragment();
		PrivateMessageLauncherFragment privateFragment = new PrivateMessageLauncherFragment();
		StereoscopicLauncherFragment stereoscopicFragment = new StereoscopicLauncherFragment();
		list.add(rewardFragment);
		list.add(privateFragment);
		list.add(stereoscopicFragment);

		adapter = new BaseFragmentAdapter(getSupportFragmentManager(),list);
		vPager.setAdapter(adapter);
		vPager.setOffscreenPageLimit(2);
		vPager.setCurrentItem(0);
		vPager.setOnPageChangeListener(changeListener);
	}
	
	/**
	 * 監聽viewpager的移動
	 */
	OnPageChangeListener changeListener=new OnPageChangeListener() {
		@Override
		public void onPageSelected(int index) {
			setImageBackground(index);//改變點點點的切換效果
			LauncherBaseFragment fragment=list.get(index);
			
			list.get(currentSelect).stopAnimation();//停止前一個頁面的動畫
			fragment.startAnimation();//開啟當前頁面的動畫
			
			currentSelect=index;
		}
		
		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {}
		@Override
		public void onPageScrollStateChanged(int arg0) {}
	};
	
	/**
	 * 改變點點點的切換效果
	 * @param selectItems
	 */
	private void setImageBackground(int selectItems) {
		for (int i = 0; i < tips.length; i++) {
			if (i == selectItems) {
				tips[i].setBackgroundResource(R.drawable.page_indicator_focused);
			} else {
				tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused);
			}
		}
	}
}

2.重寫viewpager   在dispatchDraw方法中控制顯示的背景圖片區域,
/**
 * 重寫ViewPager  主要做一個切換背景的功能
 * @author ansen
 * @create time 2015-08-07
 */
public class GuideViewPager extends ViewPager {
	private Bitmap bg;
	private Paint b = new Paint(1);
	
	public GuideViewPager(Context context) {
		super(context);
	}

	public GuideViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	protected void dispatchDraw(Canvas canvas) {
		if (this.bg != null) {
			int width = this.bg.getWidth();
			int height = this.bg.getHeight();
			int count = getAdapter().getCount();
			int x = getScrollX();
			// 子View中背景圖片需要顯示的寬度,放大背景圖或縮小背景圖。
			int n = height * getWidth() / getHeight();
			
			/**
			 * (width - n) / (count - 1)表示除去顯示第一個ViewPager頁面用去的背景寬度,剩餘的ViewPager需要顯示的背景圖片的寬度。
			 * getWidth()等於ViewPager一個頁面的寬度,即手機螢幕寬度。在該計算中可以理解為滑動一個ViewPager頁面需要滑動的畫素值。
			 * ((width - n) / (count - 1)) /getWidth()也就表示ViewPager滑動一個畫素時,背景圖片滑動的寬度。
			 * x * ((width - n) / (count - 1)) /  getWidth()也就表示ViewPager滑動x個畫素時,背景圖片滑動的寬度。
			 * 背景圖片滑動的寬度的寬度可以理解為背景圖片滑動到達的位置。
			 */
			int w = x * ((width - n) / (count - 1)) / getWidth();
			canvas.drawBitmap(this.bg, new Rect(w, 0, n + w, height), new Rect( x, 0, x + getWidth(), getHeight()), this.b);
		}
		super.dispatchDraw(canvas);
	}
	
	public void setBackGroud(Bitmap paramBitmap) {
		this.bg = paramBitmap;
		this.b.setFilterBitmap(true);
	}
}

3.主體佈局檔案  上面放一個自定義的viewpager  下面放一個顯示點點的RelativeLayout
<RelativeLayout xmlns: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" >

    <com.example.view.GuideViewPager
        android:id="@+id/viewpager_launcher"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/viewGroup"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="30dp"
            android:gravity="center_horizontal"
            android:orientation="horizontal" />
    </RelativeLayout>

</RelativeLayout>

4.ViewPager介面卡
/**
 * Viewpager介面卡
 * @author apple
 *
 */
public class BaseFragmentAdapter extends FragmentStatePagerAdapter {
	private List<LauncherBaseFragment>list;
	public BaseFragmentAdapter(FragmentManager fm, List<LauncherBaseFragment> list) {
		super(fm);
		this.list = list;
	}

	public BaseFragmentAdapter(FragmentManager fm) {
		super(fm);
	}

	@Override
	public Fragment getItem(int arg0) {
		return list.get(arg0);
	}

	@Override
	public int getCount() {
		return list.size();
	}
}

5.Fragment抽象類 有兩個抽象方法,開啟動畫跟停止動畫  所有的Fragment都繼承這個類  Viewpager切換的時候可以更好的控制每個Fragment開啟動畫,結束動畫

  1. /** 
  2.  * Fragment抽象類 
  3.  * @author ansen 
  4.  *  
  5.  */
  6. publicabstractclass LauncherBaseFragment extends Fragment{  
  7.     publicabstractvoid  startAnimation();  
  8.     publicabstractvoid  stopAnimation();  
  9. }  

6.打賞頁Fragment  三個動畫效果  硬幣向下移動動畫+打賞圖片縮放動畫+改變打賞圖片透明度然後隱藏圖片

  1. /** 
  2.  * 打賞頁面 
  3.  * @author ansen 
  4.  * @create time 2015-08-07 
  5.  */
  6. publicclass RewardLauncherFragment extends LauncherBaseFragment{  
  7.     private ImageView ivReward;  
  8.     private ImageView ivGold;  
  9.     private Bitmap goldBitmap;  
  10.     privateboolean started;//是否開啟動畫(ViewPage滑動時候給這個變數賦值)
  11.     @Override
  12.     public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {  
  13.         View rooView=inflater.inflate(R.layout.fragment_reward_launcher, null);  
  14.         ivGold=(ImageView) rooView.findViewById(R.id.iv_gold);  
  15.         ivReward=(ImageView) rooView.findViewById(R.id.iv_reward);  
  16.         //獲取硬幣的高度
  17.         goldBitmap=BitmapFactory.decodeResource(getActivity().getResources(),R.drawable.icon_gold);  
  18.         startAnimation();  
  19.         return rooView;  
  20.     }  
  21.     publicvoid startAnimation(){  
  22.         started=true;  
  23.         //向下移動動畫 硬幣的高度*2+80   
  24.         TranslateAnimation translateAnimation=new TranslateAnimation(0,0,0,goldBitmap.getHeight()*2+80);  
  25.         translateAnimation.setDuration(500);  
  26.         translateAnimation.setFillAfter(true);  
  27.         ivGold.startAnimation(translateAnimation);  
  28.         translateAnimation.setAnimationListener(new AnimationListener() {  
  29.             @Override
  30.             publicvoid onAnimationStart(Animation animation) {}  
  31.             @Override
  32.             publicvoid onAnimationEnd(Animation animation){  
  33.                 if(started){  
  34.                     ivReward.setVisibility(View.VISIBLE);  
  35.                     //硬幣移動動畫結束開啟縮放動畫
  36.                     Animation anim=AnimationUtils.loadAnimation(getActivity(),R.anim.reward_launcher);    
  37.                     ivReward.startAnimation(anim);  
  38.                     anim.setAnimationListener(new AnimationListener(){  
  39.                         @Override
  40.                         publicvoid onAnimationStart(Animation animation) {}    
  41.                         @Override
  42.                         publicvoid onAnimationRepeat(Animation animation) {}    
  43.                         @Override
  44.                         publicvoid onAnimationEnd(Animation animation) {  
  45.                                 //縮放動畫結束 開啟改變透明度動畫
  46.                                 AlphaAnimation alphaAnimation=new AlphaAnimation(1,0);  
  47.                                 alphaAnimation.setDuration(1000);  
  48.                                 ivReward.startAnimation(alphaAnimation);  
  49.                                 alphaAnimation.setAnimationListener(new AnimationListener() {  
  50.                                     @Override
  51.                                     publicvoid onAnimationStart(Animation animation) {}  
  52.                                     @Override
  53.                                     publicvoid onAnimationRepeat(Animation animation) {}  
  54.                                     @Override
  55.                                     publicvoid onAnimationEnd(Animation animation) {  
  56.                                         //透明度動畫結束隱藏圖片
  57.                                         ivReward.setVisibility(View.GONE);  
  58.                                     }  
  59.                             });  
  60.                         }  
  61.                     });  
  62.                 }  
  63.             }  
  64.             @Override
  65.             publicvoid onAnimationRepeat(Animation animation) {}  
  66.         });  
  67.     }  
  68.     @Override
  69.     publicvoid stopAnimation(){  
  70.         started=false;//結束動畫時標示符設定為false
  71.         ivGold.clearAnimation();//清空view上的動畫
  72.     }  
  73. }  

7.私信頁面   四個動畫效果   並且四個動畫都相同,其實只要我們實現了一個,其他的基本都很容易了.   依次實現四個圖片的放大然後還原

  1. /** 
  2.  * 私信 
  3.  * @author ansen 
  4.  */
  5. publicclass PrivateMessageLauncherFragment extends LauncherBaseFragment{  
  6.     private ImageView ivLikeVideo,ivThinkReward,ivThisWeek,ivWatchMovie;  
  7.     private Animation likeAnimation,thinkAnimation,watchAnimation,thisWeekAnimation;  
  8.     privateboolean started;//是否開啟動畫
  9.     

    相關推薦

    Android app引導(背景圖片切換各個頁面動畫效果)

    先看效果圖: 轉自:http://blog.csdn.net/lowprofile_coding/article/details/48037095 1.顯示三個頁面的Activity  用view pager去載入三個fragment實現,控制點點點的切換

    Androidapp引導(背景圖片切換各個頁面動畫效果)

    轉載:http://blog.csdn.net/lowprofile_coding/article/details/48037095 先看效果圖: 1.顯示三個頁面的Activity  用view pager去載入三個fragment實現,控制點點點的切換,監聽view

    app引導(背景圖片切換各個頁面動畫效果)

    轉載請註明出處:http://blog.csdn.net/lowprofile_coding/article/details/48037095前言:不知不覺中又加班到了10點半,整個啟動頁面做了一天多的時間,一共有三個頁面,每個頁面都有動畫效果,動畫效果除錯起來麻煩,既要跟i

    關於android app啟動白屏黑屏和華為手機啟動圖片跳躍閃屏的問題

    1、產生原因           關於點選app圖標出現白屏和黑屏的產生原因,首先要說的就是app的啟動模式:冷啟動(cold start),暖啟動(warm start),熱啟動(lukewarm start)。冷啟動:是指程序從無到有的過程。因為要進行頁面初始化,所以相對

    Android studio2.0在app中設定背景圖片及新增圖片資源

    我還處於摸索階段,也是在慢慢倒騰,持續更新,希望能幫助到有需要的人 首先將需要的圖片轉成png格式(png格式的圖片顏色過渡平滑且支援透明度),牆紙或啟動畫面的圖片資源儲存為jpg格式。 將圖片儲存到相應的工程之下,不要放錯了。 某工程/app/src/m

    Android使用每日必應美圖作為啟動背景圖片

    微軟必應每天都會更新一張很美的圖片作為網站的背景,拿來做啟動頁背景也是美美噠。 1.準備工作 網路請求:OKHttp 圖片載入:Picasso 每日必應圖片資料的獲取,訪問這個網址就可以獲取到每日的

    Android Studio App設定Activity背景圖片

    愛看美女網(我搞的網站,幫忙點開一下吧) 1.首先PC上要有一張png格式的圖片,複製它,注意圖片名字(只能含小寫字母a~z和數字0~9,".png“要小寫),貼上進drawable資料夾。 2.在activity_main.xml裡新增下面一句,注意新增位置,/dr

    App啟動時白屏&使用BitmapDrawable解決啟動背景圖片拉伸

    一,App啟動時,會白屏或者黑屏,採用如下方法解決: 1.啟動頁的Activity設定style <activity android:name=".activity.SplashActivity" an

    iOS開發 UIScrollView制作APP引導

    touch 技術 -s code 配置 target 視圖 需要 html http://jingyan.baidu.com/article/4dc40848a341dfc8d846f152.html 聽語音 | 瀏覽:4606 | 更新:2015-02-10 12:

    背景圖片在PC端有顯示,在手機端不顯示的解決方法

    mar 背景 如果 準備 首頁 支持 div 發現 顯示 今天看博客的資源大小,發現背景圖片有44k大的嚇人,準備壓縮一下。 壓縮之後才發現,我的背景圖片在手機端是沒有顯示的。原因是背景圖片不支持縮放。 上網查了下,發現加入如下代碼之後就支持縮放了: background-

    Android 簡單引導實現

    頁面邏輯 1.使用者開啟App,進入歡迎頁,在歡迎頁中判斷使用者是否第一次使用App(可以用Shared Preference記錄使用者使用狀態)。2.如果使用者第一次使用App,進入引導頁,使用者可以通過左右滑動檢視當前展示頁面,頁面可以是廣告,也可以是App使用說明。3.當用戶滑動到最後

    必應首背景圖片抓包-擷取api

    抓取必應圖片的方法, 作用你可以自己考慮啊。 例如給你的app每天換一個背景,或者給你的桌面換背景 畢竟,必應找的圖的質量還是可以保證的。 1.下面是獲取圖片網址的API http://cn.bing.com/HPImageArchive.aspx?format=js&am

    背景圖片切換

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width

    Android App 啟動(Splash)黑/白閃屏現象產生原因與解決辦法

    驚鴻一瞥 微信的啟動頁,相信大家都不陌生。 不知道大家有沒有發現一個現象,微信每次啟動的時候,是直接進入這個啟動頁面。 我的意思是,很多應用,往往會先白屏停頓一下後再進入啟動頁面(Splash)。為了印證這一點,我把手機上所有的App都點了一遍。選幾個例子

    Android App 啟動(Splash)黑/白閃屏現象

    寫這篇文章,首先要感謝寫此文章的人,其部落格連結如下: http://blog.csdn.net/zivensonice/article/details/51691136 其讓我看到了事件發生的原委! 直接說解決方案: 方案一: 將載入頁Loading

    css3全屏背景圖片切換特效

    一般做圖片切換效果,都會使用JS或者jQuery指令碼,今天發現,其實只用CSS也可以實現。試試效果吧。 效果圖:程式碼如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type"

    android App內監聽截圖二維碼

    Android截圖功能是一個常用的功能,可以方便的用來分享或者傳送給好友,本文介紹瞭如何實現app內截圖監控功能,當發現使用者在我們的app內進行了截圖操作時,進行對圖片的二次操作,例如新增二維碼,公司logo等一系列*。 專案地址 測試截圖:

    C#實現動態桌面背景圖片切換

    問題描述:凝視桌面背景,突感如果桌面背景是變化的像win7一樣,該多有意思啊。鬧鐘瞬間產生一個念頭,用C#寫一個動態切換桌面背景的圖片。如何實現這個想法了,我思考了一會兒,想到了如下的一些需要解決的問題:   (1):以何種方式實現切換圖片,才能更符合客戶的要求。   (2):C#使用什麼技術來切換桌面的背

    android在學習——Menu背景圖片,背景色的設定

    package com.hooypay.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.cont

    Android 專案首的Fragment切換例項(一)

    一、首頁的Activity的佈局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andr