標籤:
Fragment
- 用途:在一個Activity裡切換介面,切換介面時只切換Fragment裡面的內容
- 生命週期方法跟Activity一致,可以理解把其為就是一個Activity
定義布局檔案作為Fragment的顯示內容
//此方法返回的View就會被顯示在Fragment上@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub //用布局檔案填充成一個View對象,返回出去,那麼就顯示在Fragment上了 View v = inflater.inflate(R.layout.fragment01, null); return v; }
把Fragment顯示至指定ViewGroup中
//把fragment顯示至介面//new出fragment對象Fragment01 fg = new Fragment01();FragmentManager fm = getFragmentManager();//開啟事務FragmentTransaction ft = fm.beginTransaction();//把fragment對象顯示到指定資源id的組件裡面ft.replace(R.id.fl, fg);ft.commit();
生命週期
- fragment切換時舊fragment對象會銷毀,新的fragment對象會被建立
低版本相容
- 在support-v4.jar包中有相關api,也就是說fragment可以在低版本模擬器運行
動畫幀動畫
一張張圖片不斷的切換,形成動畫效果
在drawable目錄下定義xml檔案,子節點為animation-list,在這裡定義要顯示的圖片和每張圖片的顯示時間長度
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/g1" android:duration="200" /> <item android:drawable="@drawable/g2" android:duration="200" /> <item android:drawable="@drawable/g3" android:duration="200" /></animation-list>
在螢幕上播放幀動畫
ImageView iv = (ImageView) findViewById(R.id.iv);//把動畫檔案設定為imageView的背景iv.setBackgroundResource(R.drawable.animations);AnimationDrawable ad = (AnimationDrawable) iv.getBackground();//播放動畫 ad.start();
補間動畫
- 原形態變成新形態時為了過渡變形過程,產生的動畫就叫補間動畫
- 位移、旋轉、縮放、透明
位移:
- 參數10指的是X的起點座標,但不是指螢幕x座標為10的位置,而是imageview的 真實X + 10
參數150指的是X的終點座標,它的值是imageview的 真實X + 150
//建立為位移動畫對象,設定動畫的初始位置和結束位置TranslateAnimation ta = new TranslateAnimation(10, 150, 20, 140);
- x座標的起點位置,如果相對於自己,傳0.5f,那麼起點座標就是 真實X + 0.5 * iv寬度
- x座標的終點位置,如果傳入2,那麼終點座標就是 真實X + 2 * iv的寬度
- y座標的起點位置,如果傳入0.5f,那麼起點座標就是 真實Y + 0.5 * iv高度
y座標的終點位置,如果傳入2,那麼終點座標就是 真實Y + 2 * iv高度
TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2);
動畫播放相關的設定
//設定動畫期間ta.setDuration(2000);//動畫重複播放的次數ta.setRepeatCount(1);//動畫重複播放的模式ta.setRepeatMode(Animation.REVERSE);//動畫播放完畢後,組件停留在動畫結束的位置上ta.setFillAfter(true);//播放動畫iv.startAnimation(ta);
縮放:
- 參數0.1f表示動畫的起始寬度是真實寬度的0.1倍
- 參數4表示動畫的結束寬度是真實寬度的4倍
縮放的中心點在iv左上方
ScaleAnimation sa = new ScaleAnimation(0.1f, 4, 0.1f, 4);
- 參數0.1f和4意義與上面相同
- 改變縮放的中心點:傳入的兩個0.5f,類型都是相對於自己,這兩個參數改變了縮放的中心點
- 中心點x座標 = 真實X + 0.5 * iv寬度
中心點Y座標 = 真實Y + 0.5 * iv高度
ScaleAnimation sa = new ScaleAnimation(0.1f, 4, 0.1f, 4, Animation.RELATIVETOSELF, 0.5f, Animation.RELATIVETOSELF, 0.5f);
透明:
旋轉:
- 20表示動畫開始時的iv的角度
- 360表示動畫結束時iv的角度
預設旋轉的圓心在iv左上方
RotateAnimation ra = new RotateAnimation(20, 360);
- 20,360的意義和上面一樣
- 指定圓心座標,相對於自己,值傳入0.5,那麼圓心的x座標:真實X + iv寬度 * 0.5
圓心的Y座標:真實Y + iv高度 * 0.5
RotateAnimation ra = new RotateAnimation(20, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
所有動畫一起飛
//建立動畫集合 AnimationSet set = new AnimationSet(false); //往集合中添加動畫 set.addAnimation(aa); set.addAnimation(sa); set.addAnimation(ra); iv.startAnimation(set);
屬性動畫
- 補間動畫,只是一個動畫效果,組件其實還在原來的位置上,xy沒有改變
位移:
縮放:
透明:
旋轉
- rotation指定是順時針旋轉
- 20是起始角度
270是結束角度
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "rotation", 20, 270);
- 屬性指定為rotationX是豎直翻轉
屬性指定為rotationY是水平翻轉
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "rotationY", 20, 180);
可變參數
第三個參數可變參數可以傳入多個參數,可以實現往回位移(旋轉、縮放、透明)
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 70, 30, 100) ;
所有動畫一起飛
//建立動畫師集合 AnimatorSet set = new AnimatorSet(); //設定要播放動畫的組件 set.setTarget(bt); //所有動畫有先後順序的播放 //set.playSequentially(oa, oa2, oa3, oa4); //所有動畫一起播放 set.playTogether(oa, oa2, oa3, oa4); set.start();
對話方塊確定取消對話方塊
- 建立對話方塊構建器對象,類似原廠模式
AlertDialog.Builder builder = new Builder(this);
- 設定標題和本文
builder.setTitle("警告");builder.setMessage("若練此功,必先自宮");
設定確定和取消按鈕
builder.setPositiveButton("現在自宮", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "恭喜你自宮成功,現在程式退出", 0).show(); }});builder.setNegativeButton("下次再說", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "若不自宮,一定不成功", 0).show(); }});
使用構建器建立出對話方塊對象
AlertDialog ad = builder.create();ad.show();
單選對話方塊
AlertDialog.Builder builder = new Builder(this); builder.setTitle("選擇你的性別");
- 定義單選選項
final String[] items = new String[]{ "男", "女", "其他"};//-1表示沒有預設選擇//點擊偵聽的導包要注意別導錯builder.setSingleChoiceItems(items, -1, new OnClickListener() { //which表示點擊的是哪一個選項 @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "您選擇了" + items[which], 0).show(); //對話方塊消失 dialog.dismiss(); }});builder.show();
多選對話方塊
AlertDialog.Builder builder = new Builder(this); builder.setTitle("請選擇你認為最帥的人");
- 定義多選的選項,因為可以多選,所以需要一個boolean數組來記錄哪些選項被選了
final String[] items = new String[]{ "趙帥哥", "趙師哥", "趙老師", "侃哥"};//true表示對應位置的選項被選了final boolean[] checkedItems = new boolean[]{ true, false, false, false,};builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() { //點擊某個選項,如果該選項之前沒被選擇,那麼此時isChecked的值為true @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { checkedItems[which] = isChecked; }});builder.setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { StringBuffer sb = new StringBuffer(); for(int i = 0;i < items.length; i++){ sb.append(checkedItems[i] ? items[i] + " " : ""); } Toast.makeText(MainActivity.this, sb.toString(), 0).show(); }});builder.show();
進度條對話方塊
進度條對話方塊可以直接new
final ProgressDialog pd = new ProgressDialog(this);
設定進度條的樣式,可以是旋轉,也可以一個水平的進度條
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setTitle("正在載入,請稍後...")//設定進度條進度值的最大值pd.setMax(200);pd.show();//開啟子線程改變進度條的進度值Thread t = new Thread(){ @Override public void run() { // TODO Auto-generated method stub super.run(); for (int i = 0; i < 200; i++) { try { sleep(30); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //改變進度值 pd.setProgress(i); } pd.dismiss(); }};t.start();
Android應用開發基礎之十一:新特性