1 關于常見的對話框,主要有:
常見的對話框,單選對話框,多選對話框,進度條對話框(轉圈類型的),帶進度條的對話框。
案例結構:
完成如下結構的案例,将所有的案例都測試一下:
2 編寫mainactivity,代碼如下:
package com.itheima.dialog;
import android.app.activity;
import android.app.alertdialog;
import android.app.progressdialog;
import android.app.alertdialog.builder;
import android.content.dialoginterface;
import android.content.dialoginterface.onclicklistener;
import android.content.dialoginterface.onmultichoiceclicklistener;
import android.os.bundle;
import android.view.view;
import android.widget.toast;
public class mainactivity extends activity {
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
}
public void click1(view view) {
// 對話框的建立器
alertdialog.builder builder = new builder(this);
builder.settitle("我是對話框");
builder.setmessage("對話框顯示的内容");
// 設定點選确定按鈕後制定的動作
builder.setpositivebutton("确定", new onclicklistener() {
@override
public void onclick(dialoginterface dialog, int which) {
toast.maketext(getapplicationcontext(), "确定被點選了", 0).show();
}
});
builder.setnegativebutton("取消", new onclicklistener() {// 設定取消按鈕
@override
public void onclick(dialoginterface dialog, int which) {
// 什麼都不寫預設實作的就是關閉掉對話框
toast.maketext(getapplicationcontext(), "點選了取消按鈕",
toast.length_long).show();
}
});
builder.setcancelable(false);
builder.create().show();
/**
* 單選對話框
*
* @param view
*/
public void click2(view view) {
builder.settitle("請選擇您的性别");
final string[] items = { "男", "女", "未知" };
//這裡的1表示預設選中的是哪個,0:表示選中的是第一個
builder.setsinglechoiceitems(items, 1, new onclicklistener() {
toast.maketext(getapplicationcontext(), "您的性别:" + items[which],
0).show();
dialog.dismiss();
* 多選對話框
public void click3(view view) {
builder.settitle("請選擇你最愛吃的水果");
final string[] items = { "蘋果", "梨", "鳳梨", "香蕉", "黃瓜" };
final boolean[] result = new boolean[] { true, false, true, false,false};
builder.setmultichoiceitems(items, result,
new onmultichoiceclicklistener() {
public void onclick(dialoginterface dialog, int which,
boolean ischecked) {
toast.maketext(getapplicationcontext(),
items[which] + ischecked, 0).show();
result[which] = ischecked;
builder.setpositivebutton("送出", new onclicklistener() {
stringbuffer sb = new stringbuffer();
for (int i = 0; i < result.length; i++) {
if (result[i]) {
sb.append(items[i] + ",");
}
toast.maketext(getapplicationcontext(),
"您選中了," + sb.tostring(), 0).show();
// builder.create().show();
builder.show();
// 進度條對話框
public void click4(view view) {
progressdialog pd = new progressdialog(this);
pd.settitle("提醒");
pd.setmessage("正在加載資料...請稍等。");
pd.show();
// 帶進度的進度條對話框
public void click5(view view) {
final progressdialog pd = new progressdialog(this);
pd.setprogressstyle(progressdialog.style_horizontal);
pd.setmax(100);
new thread() {
public void run() {
for (int i = 0; i < 100; i++) {
try {
thread.sleep(40);
} catch (interruptedexception e) {
e.printstacktrace();
pd.setprogress(i);
pd.dismiss();
};
}.start();
}
==============================================================================
1 光傳感器
編寫布局檔案activity_main.xml
<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"
tools:context=".mainactivity" >
<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerhorizontal="true"
android:layout_centervertical="true"
android:text="@string/hello_world" />
</relativelayout>
package com.itheima.sensor;
import android.hardware.sensor;
import android.hardware.sensorevent;
import android.hardware.sensoreventlistener;
import android.hardware.sensormanager;
public class mainactivity extends activity {
private sensormanager sm;
private mylistener listener;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
sm = (sensormanager) getsystemservice(sensor_service);
//光線傳感器
sensor sensor = sm.getdefaultsensor(sensor.type_light);
listener = new mylistener();
sm.registerlistener(listener, sensor,sensormanager.sensor_delay_ui);
}
private class mylistener implements sensoreventlistener {
public void onsensorchanged(sensorevent event) {
float light = event.values[0];
system.out.println("light:" + light);
}
public void onaccuracychanged(sensor sensor, int accuracy) {
}
protected void ondestroy() {
sm.unregisterlistener(listener);
listener = null;
super.ondestroy();
1 android指南針,案例效果:
2 編寫布局檔案,代碼如下(activity_main.xml):
android:background="#000000"
<imageview
android:id="@+id/iv"
android:src="@drawable/zn" />
3 編寫mainactivity,代碼如下:
import android.hardware.sensoreventlistener;
import android.view.animation.animation;
import android.view.animation.rotateanimation;
import android.widget.imageview;
private imageview iv;
@suppresswarnings("deprecation")
iv = (imageview) findviewbyid(r.id.iv);
//方向傳感器
sensor sensor = sm.getdefaultsensor(sensor.type_orientation);
sm.registerlistener(listener, sensor, sensormanager.sensor_delay_game);
float lastangle = 0;
@override
// 0=north, 90=east, 180=south, 270=west
float angle = event.values[0];//手機與正北方向的夾角
system.out.println("angle:"+angle);
rotateanimation ra = new rotateanimation(-lastangle, angle,
animation.relative_to_self, 0.5f, animation.relative_to_self, 0.5f);
iv.startanimation(ra);
lastangle = angle;
補間動畫主要包括以下幾種:
a (旋轉) b(透明度) c(位移) d(縮放)
編寫一下案例:
1 android布局檔案activity_main.xml
<linearlayout
android:layout_width="match_parent"
android:orientation="horizontal" >
<button
android:onclick="rotate"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="旋轉" />
android:onclick="scale"
android:text="縮放" />
android:onclick="trans"
android:text="位移" />
android:onclick="alpha"
android:text="透明度" />
<button
android:onclick="set"
android:text="組合動畫" />
</linearlayout>
android:src="@drawable/ic_launcher" />
2 mainactivity代碼如下:
package com.itheima.tween;
import android.view.animation.alphaanimation;
import android.view.animation.animationset;
import android.view.animation.animationutils;
import android.view.animation.rotateanimation;
import android.view.animation.scaleanimation;
import android.view.animation.translateanimation;
private imageview iv;
@override
iv = (imageview) findviewbyid(r.id.iv);
// 透明度動畫
public void alpha(view view) {
// 最開始的透明度到最後的透明度,從0.0f到1.0f,從透明到不透明
animation aa = new alphaanimation(0.0f, 1.0f);
// 設定動畫播放的時間
aa.setduration(2000);
// 設定動畫重複播放的次數,下面表示重複播放3次,表示重複播放2,如果是
// -1(animation.infinite)表示一直重複播放
aa.setrepeatcount(3);
// aa.setrepeatcount(animation.infinite);
// 如果不指定這個值,預設是重複播放的。下面表示:透明-->不透明-->透明
aa.setrepeatmode(animation.reverse);
// true:界面為動畫完成之後的效果
aa.setfillafter(true);
// 開始播放
iv.startanimation(aa);
* 位移動畫
public void trans(view view) {
// 下面表示x軸從0.0f-->1.0f;0.0f-->1.0f
// android.view.animation.translateanimation.translateanimation(int
// fromxtype, float fromxvalue, int toxtype, float toxvalue, int
// fromytype, float fromyvalue, int toytype, float toyvalue)
translateanimation ta = new translateanimation(
animation.relative_to_parent, // 相對于父窗體
0.0f, // 如果是320寬度的模拟器。這裡0.0f表示是是父窗體的0%
animation.relative_to_parent, // 還是相對于父窗體
1.0f, // 表示父親的100%
animation.relative_to_parent, 0.0f,
animation.relative_to_parent, 1.0f);
ta.setduration(2000); // 設定時間間隔
ta.setrepeatcount(-1); // -1表示重複的操作
// 倒叙播放
ta.setrepeatmode(animation.reverse);
iv.startanimation(ta);
// 縮放動畫
public void scale(view view) {
scaleanimation sa = new scaleanimation(0.1f, // 縮放的時候最開始的比例
2.0f, // 上面這兩個參數x周表示從0.1倍到2倍
0.1f, 2.0f, // y軸從0.1-->2.0倍
animation.relative_to_self, // 後面4個參數的組合表示從自己中心點開始縮小放大
0.5f, animation.relative_to_self, 0.5f);
sa.setduration(2000); // 設定時間間隔
sa.setrepeatcount(1); // -1表示重複的操作
sa.setrepeatmode(animation.reverse);
iv.startanimation(sa);
// 旋轉動畫
public void rotate(view view) {
rotateanimation ra = new rotateanimation(
0, // 開始的角度
360, // 旋轉的解讀
animation.relative_to_self,
0.0f,
0.0f);
ra.setduration(2000);
ra.setrepeatcount(1);
ra.setrepeatmode(animation.reverse);
iv.startanimation(ra);
//動畫組合(包含多種動畫)
public void set(view view) {
animationset set = new animationset(false);
translateanimation ta = new translateanimation(animation.relative_to_parent, -0.5f,
animation.relative_to_parent, 0.5f,
animation.relative_to_parent, -0.5f,
animation.relative_to_parent, 0.5f);
ta.setduration(2000);
ta.setrepeatcount(1);
scaleanimation sa = new scaleanimation(0.1f, 2.0f, 0.1f, 2.0f, animation.relative_to_self,
0.5f, animation.relative_to_self, 0.5f);
sa.setduration(2000);
sa.setrepeatcount(1);
rotateanimation ra = new rotateanimation(0, 360, animation.relative_to_self,
0.0f, animation.relative_to_self, 0.0f);
set.addanimation(ra);
//set.addanimation(ta);
set.addanimation(sa);
iv.startanimation(set);
=============================================================================
1 除了通過代碼的方式制作補間動畫之外,還可以通過xml的方式制作補間動畫。
案例:
2 下面通過如下結構的代碼編寫出上面的案例:
3 編寫的布局檔案activity_main.xml如下:
4 編寫透明度的xml檔案alpha.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
android:fromalpha="0.0" 開始的透明度
android:toalpha="1.0" 結束的透明度
android:duration="2000" 動畫播放的時間
android:repeatcount="1" 動畫重複的次數
android:repeatmode="reverse" 重複的模式
android:fillafter="true"
-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromalpha="0.0"
android:toalpha="1.0"
android:duration="2000"
android:repeatcount="2"
android:repeatmode="reverse"
android:fillafter="true">
</alpha>
5 編寫旋轉的xml檔案rotate.xml
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromdegrees="0"
android:todegrees="360"
android:pivotx="50%"
android:pivoty="50%"
android:repeatcount="1"
android:repeatmode="reverse" >
</rotate>
6 編寫放大縮小的xml檔案scale.xml
android:fromxscale="0.1"
android:toxscale="2.0"
android:fromyscale="0.1"
android:toyscale="2.0"
android:duration="2000"
android:pivotx="50%"
android:pivoty="50%"
android:repeatcount="1"
android:repeatmode="reverse"
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromxscale="0.1"
android:toxscale="2.0"
android:fromyscale="0.1"
android:toyscale="2.0"
android:repeatmode="reverse">
</scale>
7 編寫位移的xml檔案trans.xml
android:fromxdelta="-50%p" 左側
android:toxdelta="50%p" 右側
android:fromydelta="0" 表示y軸方向上不變化
android:toydelta="0"
android:duration="2000" 播放2秒
android:repeatcount="1" 重複1次
-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromxdelta="-50%p"
android:toxdelta="50%p"
android:fromydelta="0"
android:toydelta="0"
</translate>
8 編寫組合動畫set.xml
<set>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillafter="true"
android:fromalpha="0.0"
android:repeatcount="1"
android:repeatmode="reverse"
android:toalpha="1.0" >
</alpha>
<rotate
android:fromdegrees="0"
android:pivotx="50%"
android:pivoty="50%"
android:todegrees="360" >
</rotate>
<scale
android:duration="2000"
android:fromxscale="0.1"
android:fromyscale="0.1"
android:toxscale="2.0"
android:toyscale="2.0" >
</scale>
<translate
android:fromxdelta="-50%p"
android:fromydelta="0"
android:toxdelta="50%p"
android:toydelta="0" >
</translate>
</set>
9 編寫mainactivity,代碼如下:
import android.view.animation.animationutils;
// 透明度動畫
public void alpha(view view) {
animation aa = animationutils.loadanimation(this, r.anim.alpha);
iv.startanimation(aa);
/**
* 位移動畫
*
* @param view
*/
public void trans(view view) {
animation ta = animationutils.loadanimation(this, r.anim.trans);
iv.startanimation(ta);
// 縮放動畫
public void scale(view view) {
animation sa = animationutils.loadanimation(this, r.anim.scale);
iv.startanimation(sa);
// 旋轉動畫
public void rotate(view view) {
animation ra = animationutils.loadanimation(this, r.anim.rotate);
iv.startanimation(ra);
//動畫組合(包含多種動畫)
public void set(view view) {
animation set = animationutils.loadanimation(this, r.anim.set);
iv.startanimation(set);
清單檔案略
幀動畫(主要是在xml中編寫:animation-list),編寫如下案例:
1 編寫布局檔案activity_main.xml
/>
2 在drawable中編寫幀動畫的xml檔案
項目中的結構如下:
android:oneshot="false" 表示重複性的播放 如果為true表示隻播放一次
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"
>
<!-- 下面表示使用指定的圖檔播放200毫秒 -->
<item
android:drawable="@drawable/girl_1"
android:duration="200"/>
android:drawable="@drawable/girl_2"
android:drawable="@drawable/girl_3"
android:drawable="@drawable/girl_4"
android:drawable="@drawable/girl_5"
android:drawable="@drawable/girl_6"
android:duration="400"/>
android:drawable="@drawable/girl_7"
android:drawable="@drawable/girl_8"
android:drawable="@drawable/girl_9"
android:drawable="@drawable/girl_10"
android:drawable="@drawable/girl_11"
</animation-list>
2 編寫mainactivity,代碼如下:
package com.itheima.frameanimation;
import android.graphics.drawable.animationdrawable;
import android.view.motionevent;
private animationdrawable manimationdrawable;
// 把xml檔案的動畫資源設定為iv背景
iv.setbackgroundresource(r.drawable.girl);
// 擷取設定的動畫資源。 執行可能需要花費一定的時間
manimationdrawable = (animationdrawable) iv.getbackground();
public boolean ontouchevent(motionevent event) {
if (event.getaction() == motionevent.action_down) {
manimationdrawable.start();
return true;
}
return super.ontouchevent(event);