天天看點

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫



1 關于常見的對話框,主要有:

常見的對話框,單選對話框,多選對話框,進度條對話框(轉圈類型的),帶進度條的對話框。

案例結構:

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

完成如下結構的案例,将所有的案例都測試一下:

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

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();

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

    /**

     * 單選對話框

     *

     * @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();

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

     * 多選對話框

    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();

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

    // 進度條對話框

    public void click4(view view) {

       progressdialog pd = new progressdialog(this);

       pd.settitle("提醒");

       pd.setmessage("正在加載資料...請稍等。");

       pd.show();

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

    // 帶進度的進度條對話框

    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();

}

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

==============================================================================

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指南針,案例效果:

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

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(縮放)

編寫一下案例:

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

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的方式制作補間動畫。

案例:

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

2 下面通過如下結構的代碼編寫出上面的案例:

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

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),編寫如下案例:

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過XML的方式編寫補間動畫

1 編寫布局檔案activity_main.xml

       />

2 在drawable中編寫幀動畫的xml檔案

項目中的結構如下:

21_Android中常見對話框,光傳感器,通過重力感應器編寫出指南針應用,幀動畫,通過Jav代碼的方式編寫補間動畫,通過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);

繼續閱讀