Fragment 用途:在一個Activity里切換界面,切換界面時只切換Fragment裡面的內容 生命周期方法跟Activity一致,可以理解把其為就是一個Activity 定義佈局文件作為Fragment的顯示內容 //此方法返回的View就會被顯示在Fragment上 @Override p
Fragment
- 用途:在一個Activity里切換界面,切換界面時只切換Fragment裡面的內容
- 生命周期方法跟Activity一致,可以理解把其為就是一個Activity
-
定義佈局文件作為Fragment的顯示內容
//此方法返回的View就會被顯示在Fragment上 @Override public 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);
透明:
-
0為完全透明,1為完全不透明
AlphaAnimation aa = new AlphaAnimation(0, 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沒有改變
位移:
- 第一個參數target指定要顯示動畫的組件
- 第二個參數propertyName指定要改變組件的哪個屬性
- 第三個參數values是可變參數,就是賦予屬性的新的值
- 傳入0,代表x起始坐標:當前x + 0
-
傳入100,代表x終點坐標:當前x + 100
//具有get、set方法的成員變數就稱為屬性 ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 100) ;
縮放:
- 第三個參數指定縮放的比例
- 0.1是從原本高度的十分之一開始
-
2是到原本高度的2倍結束
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "scaleY", 0.1f, 2);
透明:
-
透明度,0是完全透明,1是完全不透明
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "alpha", 0.1f, 1);
旋轉
- 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();