透過TextSwitcher 的切換來改變ListView 的內容, 並且在切換的同時加入Animation 動畫. 然後使用Typeface將TextView的字體改變, 意即使用custom Font. 而為了要使用custom Font需將字體檔 wt021.ttf 事先匯入 assert/font folder, 到時候再透過 Typeface.createFromAsset(getAssets(), "fonts/wt021.ttf") 取用, 特別注意要加上副檔名 .ttf
首先來看 MainActivity的部分,
package com.example.textswitcher; import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android.graphics.Typeface; import android.view.Gravity; import android.view.Menu; import android.view.View; import android.view.animation.AnimationUtils; import android.widget.ListView; import android.widget.TextSwitcher; import android.widget.TextView; import android.widget.ViewSwitcher.ViewFactory; public class MainActivity extends Activity { TextSwitcher TSwitcher; static int textIndex = 0; String[] TSwitcherContent; ListView LView; TextArrayAdapter LAdapter; Typeface font; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); font = Typeface.createFromAsset(getAssets(), "fonts/wt021.ttf"); //從 assert folder 中取用我們匯入的自訂字體 wt021.ttf iniTexTSwitcher(); iniListView(); } private void iniTexTSwitcher() { // TODO Auto-generated method stub TSwitcher = (TextSwitcher) findViewById(R.id.textSwitcher); //透過 setFactory method 產生兩個 Views給 TextSwitcher切換 TSwitcher.setFactory(new ViewFactory(){ //實作makeView() method 產生 View供TextSwitcher作切換 public View makeView() { TextView tv =new TextView(MainActivity.this); tv.setTypeface(font); // 使用自訂的字體 tv.setTextSize(40); tv.setTextColor(Color.GREEN); tv.setGravity(Gravity.CENTER); return tv; } }); TSwitcherContent = getResources().getStringArray(R.array.textSwitcherContent); //將事先定義在 /res/value 的string array 取出使用 TSwitcher.setText(TSwitcherContent[textIndex]); //替 TextSwitcher註冊 onClickListener TSwitcher.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { textIndex++; if (textIndex >= TSwitcherContent.length) textIndex = 0; TSwitcher.setText(TSwitcherContent[textIndex]); LAdapter.notifyDataSetChanged(); //告知Adapter的data 已經改變了, 所以我們手動的呼叫 notifyDataSetChanged() method LView.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in)); //當TextSwitcher切換時, 讓ListView有淡入的效果 } }); TSwitcher.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.slide_in_left)); // TextSwitcher切換時也使用動畫效果 } private void iniListView() { // TODO Auto-generated method stub LView = (ListView) findViewById(R.id.listView); LAdapter = new TextArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, TSwitcherContent, font); //宣告使用custom TextArrayAdapter that extends ArrayAdapter //android.R.layout.simple_list_item_1, 為android system resource layout 只能顯示single line, 所以本身即為一個TextView LView.setAdapter(LAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
接著來談一下TextSwitcher吧, TextSwitcher的父類別為 ViewSwitcher, 所以具有和ViewSwitcher共同的性質, ViewSwitcher 透過 setFactory(new ViewFactory()) 產生兩個child views給ViewSwitcher作切換, ViewSwitcher 只能夠有兩個 child views, 並且一次只能顯示一個, 另外 ViewSwitcher 有兩個子類別, 一為TextSwitcher 另一個為 ImageSwitcher, 差別在於TextSwitcher 所包含的 child views 只能為 TextView type的 view, ImageSwitcher 只能擁有 ImageView type的 child view
處理完畢 MainActivity.java 的內容之後我們來看 ListView, 首先ListView 和 data 之間必須有Adapter作為配接, 在這邊我們使用custom Adapter that extends ArrayAdapter, 我已經將這個custom adapter 取名為 TextArrayAdapter, 並且獨立一個.java 如下
package com.example.textswitcher; import android.app.Activity; import android.content.Context; import android.graphics.Typeface; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class TextArrayAdapter extends ArrayAdapter{ Activity mainActivity; Typeface itemFont; public TextArrayAdapter(Context context, int textViewResourceId, String[] objects, Typeface font) { super(context, textViewResourceId, objects); // TODO Auto-generated constructor stub mainActivity = (Activity) context; //特別取得 MainActivity itemFont = font; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View rowview = convertView; if (rowview == null) { LayoutInflater inflater = mainActivity.getLayoutInflater(); rowview = inflater.inflate(android.R.layout.simple_list_item_1, parent, false); //為了要把xml所描述的Layout轉變為View , 也就是我們要的rowview //所以必須使用LayoutInflater來轉化 , 而要取得LayoutInflater的Instance方式還包括 //LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //接著再使用inflate (int resource, ViewGroup root, boolean attachToRoot) //傳回我們要的rowview } TextView item = (TextView) rowview; item.setTypeface(itemFont); item.setGravity(Gravity.CENTER); //根據當前的 textIndex 來決定ListView該呈現的內容 switch(MainActivity.textIndex) { case 0: item.setText("First"); break; case 1: item.setText("Second"); break; case 2: item.setText("Third"); break; case 3: item.setText("Fouth"); break; } return rowview; } }
最後是簡單的 activity_main.xml
沒有留言:
張貼留言