Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android小項目之--動畫和下拉框的相互應用 (附源碼)

Android小項目之--動畫和下拉框的相互應用 (附源碼)

編輯:Android開發實例

  由於android手機屏幕的局域性,有時候使用選擇功能的時候用下拉框顯示數據是再好不過的選擇了,android Tool自身提供了一個下拉框 名字叫:Spinner

本例中將會用到比較多的知識點,希望讀者能耐心看完,相信看完後將會給你很大幫助,下麵將列舉一下本例子要用到的幾個知識點:

一:Spinner  (下拉框)

   數據篇:在這裡Spinner相當於asp.net服務器控件(DropDownList),設置數據方法setAdapter() ,此時需要傳進來的參數為一個ArrayAdapter<String>類型的數據集,使用方法看後文。

  樣式篇:Android 自身提供的樣式己經非常好用,但有時我們自有的樣式可能滿足不了我們,如何定制Spinner的樣式呢?Android同時也為我們提供了一個方法 setDropDownViewResource() 此方法參數為int型,我們可以在Layout添加一個xml文件,然後在xml文件裏面寫style指明Spinner的樣式,然後通過如下 adpater.setDropDownViewResource(R.layout.dropdown);設置下拉框彈出樣式,xml詳細使用看後文。

二:Animation  (動畫)

  類型篇:Android的動畫(Animation )由四種類型組成:alpha、scale、translate以及rotate;分別為[alpha、scale]--漸變動畫 、[translate、rotate]  --畫面轉換動畫。

--------------------------------------------------------alpha---------------------------------------------------

     alpha:透明度控制動畫效果  

      浮點型值:fromAlpha 屬性為動畫起始時透明度

           toAlpha  屬性為動畫結束時透明度

        說明:0.0  表示完全透明 1.0表示完全不透明   以上取值0.0-1.0之間的float數據類型的數字

      長整型值:duration  屬性為動畫持續時間

        說明:時間以毫秒為單位

----------------------------------------------------scale----------------------------------------------------

    scale:尺寸伸縮效果

      屬性:interpolator  指定一個動畫的插入器

          android自帶有三種動畫插入器: accelerate_decelerate_interpolator 加速、減速動畫插入器

                          accelerate_interpolator        加速 動畫插入器

                           decelerate_interpolator        減速動畫插入器

          浮點型值:fromXScale  屬性為動畫起始時  X坐標上的伸縮尺寸

               toXScale   屬性為動畫結束時 X座標上的伸縮尺寸

               fromYScale  屬性為動畫起始時  Y坐標上的伸縮尺寸

                 toYScale     屬性為動畫結束時 Y座標上的伸縮尺寸

          說明:以上四種屬性值 0.0表示收縮到沒有    1.0表示正常無伸縮    值小於1.0表示伸縮     值大於1.0表示放大

              pivotX     屬性為動畫相對於物件大於X座標的開始位置

              pivotY     屬性為動畫相對於物件大於X座標的開始位置

          說明:以上兩個屬性值從 0%-100%中取值   50%為物件的X或Y方向 坐標上的中點位置

          長整型值:duration 屬性為動畫持續時間  說明:時間以毫秒為單位

          布爾型值:fillAfter  屬性當設置為true,該動畫轉化在動畫結束後被應用

 

----------------------------------------------------translate --------------------------------------------

    translate 位置轉移動畫效果 (本例子將會使用到這個動畫效果,請留意後文詳細使用方法)

          整型值:fromXDelta 屬性為動畫超始時 X坐上的位置

              toXDelta   屬性為動畫結束時 X坐上的位置

              fromYDelta  屬性為動畫超始時 Y坐上的位置

              toYDelta    屬性為動畫結束時 Y坐上的位置   注意:沒有指定任何參數時,默認是以自己為參照物

          長整型值:duration   屬性為動畫持續時間  說明:時間以毫秒為單位

 

--------------------------------------------rotate ------------------------------------------------

 

    rotate 旋轉動畫效果

        屬性:interpolator 指定一個動畫的插入器 

       android自帶有三種動畫插入器: accelerate_decelerate_interpolator 加速、減速動畫插入器

                          accelerate_interpolator        加速 動畫插入器

                            decelerate_interpolator        減速動畫插入器

        其它動畫效果: 

        浮點數型值:fromDegrees 屬性為動畫起始時物件的角度

              toDegrees    屬性為動畫起始時物件旋轉的角度 可以大於360度

        說明:當角度為負數--表示逆時針旋轉

           當角度為正數--表示順時針旋轉

            (負數from——to正數:順時針旋轉)  
                         (負數from——to負數:逆時針旋轉)
                         (正數from——to正數:順時針旋轉)
                         (正數from——to負數:逆時針旋轉)      

          pivotX     屬性為動畫相對於物件的X坐標的開始位置
            pivotY     屬性為動畫相對於物件的Y坐標的開始位置
               
                說明:        以上兩個屬性值 從0%-100%中取值
                             50%為物件的X或Y方向坐標上的中點位置

              長整型值: duration 屬性為動畫持續時間 說明:       時間以毫秒為單位
------------------------------------------------------------可愛的分割線----------------------------------------------

基本知識點如上:希望大家能耐心看完,下面正式進入代碼實例

按照以往慣例,先上項目運行效果圖:

 

 

 

代碼片段一:

 

   adpater=new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item,dropDownData);
        //此句代碼意思為通過我們後面定義在layout的style文件為下拉框定義樣式
        //adpater.setDropDownViewResource(R.layout.dropdown);
        
        adpater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //通過上面為適配器附加數據和指定樣式之後,,把適配器放進下拉框
        mSpinner.setAdapter(adpater);

 

上述代碼通過定義一個 ArrayAdapter<String> 通過使用R.array.MyCountry 訪問事先定義好的集合將一個數組加載進給它,之後設置adpater 的樣式,在這裡我使用了android默認的樣式,如果喜歡自定義下拉框的可以用上面那段代碼,具體xml文件如下:

         
 

 

<?xml version="1.0" encoding="UTF-8"?>
<TextView android:text="@ id/TextView01" android:id="@ id/TextView01"
 android:layout_width="wrap_content" android:layout_height="24sp"
 android:singleLine="true"
 style="?android:attr/spinnerDropDownItemStyle" 
 xmlns:android="http://schemas.android.com/apk/res/android">
 </TextView>

 

代碼片段二:

 addButton.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 
                String test=myEditText.getText().toString();
                 
                     for(int i=0;i<adpater.getCount();i )
                     {
                         if(test.equals(adpater.getItem(i)))
                         {
                             Show("存在相同的值");
                             return;
                         }
                     }
                     if(test.length()>0)
                     {
                         adpater.add(test);
                         int position=adpater.getPosition(test);
                         mSpinner.setSelection(position); 
                     }      
            }
        });

 

效果圖上所示,我們有一個文本框,當用戶向文本框輸入value時,並同時點擊添加按鈕,將會把value加入Spinner並同時選中,這裡用的還是apapter,因為上面我們己經給它綁定數據了,此時向adapter添加數據時,Spinner也會跟著同步顯示

代碼片段三:

removeButton.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 if(mSpinner.getSelectedItem().toString()!=adpater.getItem(0))
                 {
                     new AlertDialog.Builder(testSpinner.this)
                     .setTitle("提示")
                     .setMessage("確定刪除嗎?")
                     .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                        
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                             adpater.remove(mSpinner.getSelectedItem().toString());
                        }
                    })
                    .setNeutralButton("取消", null).show();
                    
                 }
                 if(adpater.getCount()==1)
                 {
                     Show("己經沒有數據可以刪除");
                 }
            }
        });

 

刪除操作,這裡用到了提示對話框,如果選中的不是”請選擇“也就是   adpater.getItem(0)不是這個值,就進行刪除相關操作。

代碼片段四:

 mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub
                if(adpater.getItem(arg2)!=adpater.getItem(0))
                { 
                    Show(adpater.getItem(arg2));
                } 
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub
                
            }
        });
        
        myAnimation=new TranslateAnimation(0, -100, 0.0f, 0.0f);
        myAnimation.setDuration(3000);
        
      //  myAnimation=AnimationUtils.loadAnimation(this, R.layout.anim);
        mSpinner.setOnTouchListener(new OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                v.startAnimation(myAnimation);
                return false;
            }
        });

 

上述代碼就是我們本例的關鍵代碼,先看onItemSelected這個事件,當spinner選擇改變後激發,代碼在編寫的時候遇到個問題,就是一加載Spinner會把”請選擇“這個提示用戶操作的話也彈出來,在實際項目中這是不用處理的,所以 加上這個判斷 if(adpater.getItem(arg2)!=adpater.getItem(0)),不知道為什麽,直接用字符串判斷不起效果的,比如if(adpater.getItem(arg2)!=”請選擇“)這用的操作似乎不起效果。

       代碼中用到的動畫代碼,這裡我並沒有為它做XML文件來加載,而是直接寫入數值,如果有朋友想用XML加載的話可以選建一個XML文件,文件大致代碼如下:

 

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta ="0"
    android:toXDelta ="-100" 
    android:duration="300"
></translate>



</set>

 

    這裡我只用到了一個translate,想定義多個,可以參照上文我給出的知識點,做相應處理。建完XML調用 myAnimation=AnimationUtils.loadAnimation(this, R.layout.anim);這個方法即可將XML文件我們定義好的動畫加載進來。用法很簡單,最後用戶要做的就是在你想觸發的事件裏面調用 v.startAnimation(myAnimation);V是指事件中傳遞進來的View,參數為:一個動畫的變量。

      至此功能以經完成,考慮到篇輻問題,這裡就先不把所有代碼貼出來,想要的朋友去我附件下載。後續將針對不同動畫的效果作出例子出來,希望你能關注。

 

源碼下載:/Files/TerryBlog/testSpinner.rar

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved