android基礎學習-android篇day13-UI基礎控制元件(下)

發條魚發表於2018-09-17

ImageView的scaleType的屬性理解

該屬性指定了你想讓ImageView如何顯示圖片,包括是否進行縮放、等比縮放、縮放後展示位置等

scaleType屬性既可以在 XML 中設定,也可以在程式碼中設定:

android:scaleType="centerInside"          //XML中
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);    //程式碼中

八個ScaleType,其實可以分為三個型別:

  1. FIT_開頭的4種,它們的共同點是都會對圖片進行縮放;
  2. CENTER_開頭的3種,它們的共同點是居中顯示,圖片的中心點會與ImageView的中心點重疊;
  3. ScaleType.MATRIX,使用時特別注意;
android:scaleType=“center”  保持原圖的大小,顯示在ImageView的中心。當原圖的size大於ImageView的size時,多出來的部分被截掉。 
android:scaleType=“center_inside”  以原圖正常顯示為目的,如果原圖大小大於ImageView的size,就按照比例縮小原圖的寬高,居中顯示在ImageView中。如果原圖size小於ImageView的size,則不做處理居中顯示圖片。 
.android:scaleType=“center_crop”  以原圖填滿ImageView為目的,如果原圖size大於ImageView的size,則與center_inside一樣,按比例縮小,居中顯示在ImageView上。如果原圖size小於ImageView的size,則按比例拉昇原圖的寬和高,填充ImageView居中顯示。 
androd:scaleType=“fit_xy”  把圖片按照指定的大小在ImageView中顯示,拉伸顯示圖片,不保持原比例,填滿ImageView. 
android:scaleType=“fit_start”  把原圖按照比例放大縮小到ImageView的高度,顯示在ImageView的start(前部/上部)。 
android:sacleType=“fit_center”  把原圖按照比例放大縮小到ImageView的高度,顯示在ImageView的center(中部/居中顯示)
android:scaleType=“fit_end”  把原圖按照比例放大縮小到ImageView的高度,顯示在ImageVIew的end(後部/尾部/底部)
android:scaleType=“matrix” 

不改變原圖的大小,從ImageView的左上角開始繪製,超出部分做剪下處理。  

最後一個模式需要與ImageView.setImageMatrix(Matrix matrix) 配合使用,因為該模式需要用於指定一個變換矩陣用於指定圖片如何展示。

另外注意,在使用時,需要先呼叫

imageView.setScaleType(ImageView.ScaleType.MATRIX);

再呼叫

imageView.setImageMatrix(matrix);

注意順序不要搞錯,否則會出現問題的。下面看一下程式碼:

imageView.setScaleType(ImageView.ScaleType.MATRIX);  //設定為矩陣模式

Matrix matrix = new Matrix();           //建立一個單位矩陣
matrix.setTranslate(100, 100);          //平移x和y各100單位
matrix.preRotate(30);                   //順時針旋轉30度
imageView.setImageMatrix(matrix);       //設定並應用矩陣

原圖的size小於ImageView的size時                                                         原圖的size大於ImageView的size時

 

CheckBox的基本應用

設定監聽器:OnCheckedChangeListener

package com.example.ui;

import java.util.ArrayList;
import java.util.List;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
	private CheckBox cb_run, cb_sing, cb_dance;
	private Button bt_all, bt_notall, bt_show;
	private TextView tx_show;
	private List<String> list;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.checkbox);
		// 初始化
		initView();
		setListener();
		initData();
	}

	private void initData() {
		// 建立一個陣列,儲存顯示的內容
		list = new ArrayList<String>();
	}

	public void initView() {
		cb_run = (CheckBox) findViewById(R.id.cb_run);
		cb_sing = (CheckBox) findViewById(R.id.cb_sing);
		cb_dance = (CheckBox) findViewById(R.id.cb_dance);
		bt_all = (Button) findViewById(R.id.btn_All);
		bt_notall = (Button) findViewById(R.id.btn_notAll);
		bt_show = (Button) findViewById(R.id.btn_showResult);
		tx_show = (TextView) findViewById(R.id.tx_Result);
	}

	// 給每個checkBox和btn設定監聽函式
	public void setListener() {
		cb_run.setOnCheckedChangeListener(new cbOnCheckListener());
		cb_sing.setOnCheckedChangeListener(new cbOnCheckListener());
		cb_dance.setOnCheckedChangeListener(new cbOnCheckListener());
		bt_all.setOnClickListener(new btnOnClickLsitener());
		bt_notall.setOnClickListener(new btnOnClickLsitener());
		bt_show.setOnClickListener(new btnOnClickLsitener());

	}

	// 建立一個類實現監聽,隱藏類監聽
	class cbOnCheckListener implements OnCheckedChangeListener {

		@Override
		public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
			// 當選中狀態發生改變時觸發
			CheckBox checkbox = (CheckBox) arg0;// CheckBox是CompoundButton的子類,強轉成CheckBox
			switch (checkbox.getId()) {// 通過獲取id來獲取每個CheckBox的狀態
			case R.id.cb_run:
				if (cb_run.isChecked()) {
					cb_run.setTextColor(Color.RED);
					Toast.makeText(MainActivity.this, "運動很好" + arg1,
							Toast.LENGTH_SHORT).show();
				} else {
					cb_run.setTextColor(Color.BLACK);
					Toast.makeText(MainActivity.this, "不運動不好" + arg1,
							Toast.LENGTH_SHORT).show();
				}
				break;
			case R.id.cb_sing:
				Toast.makeText(MainActivity.this, "唱歌" + arg1,
						Toast.LENGTH_SHORT).show();
				break;
			case R.id.cb_dance:
				Toast.makeText(MainActivity.this, "跳舞" + arg1,
						Toast.LENGTH_SHORT).show();
				break;

			}

		}

	}

	// 建立一個隱藏內部類實現監聽
	class btnOnClickLsitener implements OnClickListener {

		@Override
		public void onClick(View arg0) {
			// 當按鈕發生改變
			switch (arg0.getId()) {// 通過id來判斷哪個按鈕被點選
			case R.id.btn_All:
				// 如何全選,則設定選擇框的屬性都是被選中狀態
				cb_dance.setChecked(true);
				cb_sing.setChecked(true);
				cb_run.setChecked(true);
				break;

			case R.id.btn_notAll:
				// 如何全部選,則設定選擇框的屬性都是未選中狀態
				cb_dance.setChecked(false);
				cb_sing.setChecked(false);
				cb_run.setChecked(false);
				break;
			case R.id.btn_showResult:// 顯示選中的結果
				if (cb_run.isChecked()) {
					list.add(cb_run.getText().toString());
				}
				if (cb_sing.isChecked()) {
					list.add(cb_sing.getText().toString());
				}
				if (cb_dance.isChecked()) {
					list.add(cb_dance.getText().toString());
				}
				tx_show.setText(list.toString());
				list.clear();//每次執行完清空
				break;
			default:
				break;
			}

		}

	}

}

效果圖: 

RadioButton的使用步驟

  • 1、RadioButton是圓形單選框
  • 2、RadioGroup是一個可以容納多個RadioButton的容器
  • *在RadioGroup中RadioButton控制元件可以有多個,但同時有且只僅有一個可以被選中
  • 單選按鈕的實現
  1. 在xml檔案中定義RadioGroup
  2. 在RadioGroup中新增RadioButton
  3. 在Java程式碼中獲取控制元件物件
  4. 為物件新增監聽器
package com.example.ui;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class RadioButtonDemo extends Activity {
	private RadioGroup rg_sex;
	private RadioButton rb_Male, rb_FeMale;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.radiobutton);
		// 獲取物件
		rg_sex = (RadioGroup) findViewById(R.id.rg_sex);
		rb_Male = (RadioButton) findViewById(R.id.rb_Male);
		rb_FeMale = (RadioButton) findViewById(R.id.rb_FeMale);
		//為radiogroup設定監聽
		rg_sex.setOnCheckedChangeListener(new myRadioButtonListener());

	}

	class myRadioButtonListener implements OnCheckedChangeListener {

		@Override
		public void onCheckedChanged(RadioGroup arg0, int arg1) {
			// 選中狀態改變時觸發
			switch (arg1) {
			case R.id.rb_Male:// 選中男性
				Log.i("sex", "選中男性" + rb_Male.getText().toString());
				break;
			case R.id.rb_FeMale:// 選中女性
				Log.i("sex", "選中女性" + rb_FeMale.getText().toString());
				break;

			default:
				break;
			}

		}

	}

}

 狀態開關按鈕(ToggleButton)ToggleButton的使用

  • android:disabledAlpha:"" //設定按鈕在禁用時的透明度
  • android:textOff:"" //按鈕沒有被選中時顯示的文字
  • android:textOn:"" //按鈕被選中時顯示的文字(預設狀態)
package com.example.ui;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class ToggleButtonDemo extends Activity {
	private ToggleButton toggleButton;
	private ImageView iv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.togglebutton);
		toggleButton = (ToggleButton) findViewById(R.id.tb);
		iv=(ImageView) findViewById(R.id.iv);
		// 匿名內部類方法設定監聽函式
		toggleButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (toggleButton.isChecked()) {
					Toast.makeText(ToggleButtonDemo.this,
							toggleButton.getText().toString(),
							Toast.LENGTH_SHORT).show();
					iv.setImageResource(R.drawable.icon1);
				} else {
					Toast.makeText(ToggleButtonDemo.this,
							toggleButton.getText().toString(),
							Toast.LENGTH_SHORT).show();
					iv.setImageResource(R.drawable.icon2);
				}

			}
		});
	}

}

開關按鈕(ToggleButton)與開關(Switch)的功能與用法 

狀態開關按鈕(ToggleButton)與開關(Switch)也是由 Button 派生出來的,因此它們的本質也是按鈕,Button 支援的各種屬性、方法也適用於 ToggleButton 和 Switch。從功能上來看,ToggleButton、Switch 與 CheckBox 核取方塊非常相似,它們都可以提供兩個狀態。不過 ToggleButton、Switch 與 CheckBox 的區別主要體現在功能上,ToggleButton、Switch 通常用於切換程式中的某種狀態。

ToggleButton 所支援的 XML 屬性及相關方法的說明

XML屬性 相關方法 說明
android:checked setChecked(boolean) 設定該按鈕是否被選中
android:textOff   設定當該按鈕的狀態關閉時顯示的文字
android:textOn   設定當該按鈕的狀態開啟時顯示的文字

Switch 支援的 XML 屬性及相關方法說明

XML 屬性 相關方法 說明
android:checked setChecked(boolean) 設定該開關是否被選中
android:switchMinWidth setSwitchMinWidth(int) 設定該開關的最小寬度
android:switchPadding setSwitchPadding(int) 設定開關與標題文字之間的空白
android:switchTextAppearance setSwitchTextAppearance(Context,int) 設定該開關圖示上的文字樣式
android:textOff setTextOff(CharSequence) 設定該開關的狀態關閉時顯示的文字
android:textOn setTextOn(CharSequence) 設定該開關的的狀態開啟時顯示的文字
android:textStyle setSwitchTypeface(Typeface) 設定該開關的文字的風格
android:thumb setThumbResource(int) 指定使用自定義Drawable 繪製該開關的開關按鈕
android:track setTrackResource(int) 指定使用自定義Drawable 繪製該開關的開關軌道
android:typeface setSwitchTypeface(Typeface) 設定該開關的文字的字型風格

SeekBar控制元件:可拖動進度條的基本使用

Android 中元件有很多種,其中 SeekBar 就是其中經常見到的元件之一。

SeekBar 是滑動條元件,在音視訊的播放器的下面經常看到。

該元件的屬性:

  • ·android:max 設定範圍最大值
  • ·android:progress 設定當前進度值
  • ·android:secondaryProgress 設定當前次進度值
  • ·android:progressDrawable 設定進度條的圖片
  • ·android:thumb 設定進度條的滑塊的圖片

常用的方法:

  • ·getMax()
  • ·getProgress()
  • ·setMax(int)
  • ·setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener l)

監聽器 SeekBar.OnSeekBarChangeListener 中可以監聽三種事件:

  • 數值的改變 (onProgressChanged) 
  • 開 始 拖 動 (onStartTrackingTouch) 
  • 停 止 拖 動 (onStopTrackingTouch)

需要說明的是屬性 progressDrawable 和 thumb 的任意設定可以得到不同顯示效果的滑 動條。
監聽器 SeekBar.OnSeekBarChangeListener 很重要,可以響應重要的事件。

package com.example.ui;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class seekbarDemo extends Activity {
	private SeekBar sb;
	private TextView tv1, tv2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.seekbar);
		sb = (SeekBar) findViewById(R.id.sb);
		tv1 = (TextView) findViewById(R.id.tv);
		tv2 = (TextView) findViewById(R.id.tv2);
		// 設定進度條最大值
		sb.setMax(100);
		// 設定當前進度
		sb.setProgress(30);
		sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar arg0) {
				// 在結束拖動進度條時觸發

			}

			@Override
			public void onStartTrackingTouch(SeekBar arg0) {
				// 在開始拖動進度時發化時觸發
				tv1.setText("初始進度值為:" + sb.getProgress() + " ");
				// Log.i("progress",sb.getProgress()+"初始進度 ");
			}

			@Override
			public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
				// T在拖動進度發生變化時觸發
				/*
				 * 3個引數 1、當前繫結的seekbar物件 2、當前進度數值 3、是否為使用者手動觸發
				 */
				tv2.setText("拖動後的進度值為:" + sb.getProgress() + " ");
				// Log.i("progress", sb.getProgress()+"拖動後的進度");
			}
		});

	}

}

ProgressBar 進度條

內容概覽:

  • Android中的進度條
  • ProgressBar 樣式
  • ProgressBar 進度
  • ProgressBar  常用方法

 

 Progress樣式:

  • 預設圓形
  • 超大號圓形
  • 小號圓形
  • 水平方向-長條形

ProgeressBar-進度 

  • max:最大進度值
  • progress:當前進度值
  • SecondaryProgress:次要進度值

ProgeressBar-常用方法

  • isInterminate():判斷當前進度條狀態
  • incremen(Secondary)ProgressBy(int arg0):累加進度值

通過按鈕動態更改progress的進度

package com.example.ui;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

/*
 * 通過按鈕動態更改progress的進度
 */

public class ProgressBarDemo extends Activity {
	private ProgressBar pb;
	private Button bt1, bt2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.progressbar);
		initView();
		pb.setMax(100);
		pb.setProgress(30);// 第一進度
		pb.setSecondaryProgress(50);// 第二進度
		bt1.setOnClickListener(new progressbarListener());
		bt2.setOnClickListener(new progressbarListener());
	}

	private void initView() {
		pb = (ProgressBar) findViewById(R.id.pb);
		bt1 = (Button) findViewById(R.id.bt_add1);
		bt2 = (Button) findViewById(R.id.bt_add2);

	}

	class progressbarListener implements OnClickListener {

		@Override
		public void onClick(View arg0) {
			switch (arg0.getId()) {
			case R.id.bt_add1:
				pb.incrementProgressBy(20);// 首要進度值累加20
				break;
			case R.id.bt_add2:
				pb.incrementSecondaryProgressBy(40);// 次要進度值累加40

				break;

			default:
				break;
			}

		}

	}

}

RatingBar評分條的使用:

  <RatingBar 
        android:id="@+id/ratingbar_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:isIndicator="false"
        android:numStars="5"
        android:stepSize="0.5"/>
		rb=(RatingBar) findViewById(R.id.ratingbar_id);
		rb.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
			
			@Override
			public void onRatingChanged(RatingBar arg0, float arg1, boolean arg2) {
				// 1、當前繫結的ratingbar的物件 
				//2、當前評分的進度 
				//3、是否由使用者觸發
				Toast.makeText(RatingBarDemo.this, "我是ratingbar", Toast.LENGTH_SHORT).show();
				Log.i("out", "當前ratingbar的評分:"+arg1+"是否來自使用者"+arg2+"當前評分刻度"+arg0.getStepSize());
				
				
				
			}
		});

DatePicker日期選擇器和TimePicker的使用

package com.example.ui;

import java.util.Calendar;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
import android.widget.Toast;

public class DatePickerDemo extends Activity {
	private DatePicker dp;
	private TimePicker tp;
	private TextView tv;
	private int Year, Month, Day, Hour, Minute;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.datepicker);
		initView();
		getCurrentTime();
		setPicker();
	}

	private void getCurrentTime() {
		// 獲取系統當前時間
		Calendar calendar = Calendar.getInstance();
		Year = calendar.get(Calendar.YEAR);
		Month = calendar.get(Calendar.MONTH);
		Day = calendar.get(Calendar.DAY_OF_MONTH);
		Hour = calendar.get(Calendar.HOUR);
		Minute = calendar.get(Calendar.MINUTE);

	}

	private void setPicker() {
		// 設定時間選擇器為24小時
		tp.setIs24HourView(true);
		// 設定時間選擇器的當前時間
		tp.setCurrentHour(Hour);
		tp.setCurrentMinute(Minute);
		tp.setOnTimeChangedListener(new OnTimeChangedListener() {

			@Override
			public void onTimeChanged(TimePicker arg0, int arg1, int arg2) {
				// 當時間選擇器發生改變時觸發(物件,小時,分鐘)
				Log.i("TimePicker", arg1 + "-" + arg2);
				Hour = arg1;
				Minute = arg2;

			}
		});
		// 設定日期選擇器的時間
		dp.init(Year, Month, Day, new OnDateChangedListener() {

			@Override
			public void onDateChanged(DatePicker arg0, int arg1, int arg2,
					int arg3) {
				Toast.makeText(DatePickerDemo.this, "a", Toast.LENGTH_LONG)
						.show();
				// 物件,年,月,日
				Log.i("DatePicker", arg1 + "-" + (arg2 + 1) + "-" + arg3);
				// 將時間日期顯示在textview上
				tv.setText(+arg1 + "-" + (arg2 + 1) + "-" + arg3 + " " + Hour
						+ "-" + Minute);

			}

		});

	}

	private void initView() {
		// 獲取物件
		dp = (DatePicker) findViewById(R.id.dp);
		tp = (TimePicker) findViewById(R.id.tp);
		tv = (TextView) findViewById(R.id.dp_tv);

	}

}

Activity的管理

  • 內容概在一個應用程式中定義多個Activity
  • 啟動一個Activity
  • Android當中的back stack

建立一個Activity的流程

  1. 建立一個Activity的子類
  2. 重寫onCreate方法,當前Activity的入口
  3. 在AndroidManifest.xml中註冊
  4. AndroidManifest中有這段程式碼的就是預設開啟的第一個介面
 <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>

啟動一個Activity的流程

  1. -建立Intent意圖物件(連線四大元件的紐帶,可以實現介面切換,可以包含動作和動作資料)
  2. -呼叫setClass設定要啟動哪個Activity
  3. -呼叫startActivity進行跳轉
	bt=(Button) findViewById(R.id.bt);
		bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				/*
				 * 啟動一個activity
				 * 1.建立Intent物件
				 * 2.呼叫setClass你要跳轉哪個activity
				 * 3.startActivity
				 */
				Intent intent =new Intent();
				//當前Activity,你要跳轉的Activity
				intent.setClass(Activity1.this, Activity02.class);
				startActivity(intent);
			}
		});

BackStack回退棧

棧的作用:是一個先進後出的結構,回退棧中只顯示最上面的Activity,主要用於維護記錄Activity的啟動順序,

backStack中可存多個Activity,但作業系統中只顯示此Activity物件,其它Acitivity物件都會被壓入到棧中,

當按back鍵,棧頂端的Activity會被銷燬。

 

 

相關文章