原创 Android第五站 用户界面的其他应用

2011-1-27 00:32 2931 5 5 分类: 智能手机

用户界面的设计还有其他的一些应用,如下面的应用:

3.15如iPone拖动相片特效——Galery画廊。

这个范例需要不少技巧,包括Android.content.Context、Android.widget.BaseAdpter、Androi.widget.ImageView等通常会用在设计相册、图片类型的选择器上。

在开始之前,必须先了解什么是Context以及widget里的BaseAdapter,在Activity当中Context就如同张Canvas画布,随时等着被处理或覆盖。

本例中在Layout里布局一个Gallery对象,在通过widget.BaseAdapter容器存放Gallery所需要的图片,为了快速掌握Gallery的使用方法,在此使用了Android默认的Icon图标。

在主程序中较为重要的就是创建一个继承自BaseAdapter的ImageAdapter方法,这个ImageAdapter的存在目的是为了暂存欲显示的图片,并作为Gallery控件图片的源引用。

首先是创建Gallery

  <Gallery
  android:id="@+id/myGallery1"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="bottom"
  />

主程序如下

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;

/*欲使用Layout中的Gallery widget必须引用这个模块*/
import android.content.Context;
import android.widget.Gallery;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class ex3_15 extends Activity {
 
  private TextView mTextView01;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mTextView01 = (TextView) findViewById(R.id.myTextView01);
        mTextView01.setText(getString(R.string.str_txt1));
        mTextView01.setTextColor(Color.BLUE);
       
   
     ((Gallery) findViewById(R.id.myGallery1))
                   .setAdapter(new ImageAdapter(this));   //找到图像的ID
     
    }
   
    public class ImageAdapter extends BaseAdapter 
    {
   
   /* 类成员 myContext为Context父类 */
      private Context myContext;
     
     
/*使用android.R.drawable里面的图片作为图资源库,类型为整形数组*/
      private int[] myImageIds =
                    {
                      android.R.drawable.btn_minus,
                      android.R.drawable.btn_radio,
                      android.R.drawable.ic_lock_idle_low_battery,
                      android.R.drawable.ic_menu_camera
                    };
     
/* 构造器只有一个参数,即要存储的Context */
      public ImageAdapter(Context c) { this.myContext = c; }

      /* 返回所以已定义的图片总数 */
      public int getCount() { return this.myImageIds.length; }

      /* 利用getItem方法,取得目前容器中图像数组的ID */
      public Object getItem(int position) { return position; }
      public long getItemId(int position) { return position; }
     
    
  /* 取得目前欲显示的图像View传入数组ID值读取图像和使图像成像 */
      public View getView(int position, View convertView,
                          ViewGroup parent)
      {
        /* 创建一个ImageView对象 */
        ImageView i = new ImageView(this.myContext);
       
        i.setImageResource(this.myImageIds[position]);
        i.setScaleType(ImageView.ScaleType.FIT_XY);
       
       
/* 设置这个ImageView的宽高,单位为dip */
        i.setLayoutParams(new Gallery.LayoutParams(120, 120));
        return i;
      }

     /*依据距离中央的距离位移量,利用getScale返回views的大小(0.0f to 1.0f)*/
      public float getScale(boolean focused, int offset)
      {
        /* Formula: 1 / (2 ^ offset) */
        return Math.max(0,1.0f/(float)Math.pow(2,Math.abs(offset)));
       }
     }
}

若要从外部导入图片,只需要在res/drawable底下导入(import)图形文件即可,这些图形文件也会在部署阶段跟着应用程序一起打包成.apk,而程序需要改写如下片段,指定为图像的名称即可。

private int[] myImageIds={

R.drawable.image1,

R.drawable.image2,

R.drawable.image3,

R.drawable.image4,

}

 

3.18程序加载中,请稍后——Progress与线程整合应用。

在Android里,则是通过ProgressDialog来运行,这个类封装在Android.app.ProgressDialog里,但是需要注意的是Android的ProgressDialog必须要在后台程序运行完毕前,以dismiss()方法关闭取得焦点的对话框,否则程序会陷入无法终止的无穷循环中,又或者在线程里不可有任何更改Context或parent View的任何状态、文字输出等事件,因为在线程里的Context与View并不属于parent,两者之间没有任何关系,所以,在以下的范例中,我们用线程(Thread)来模拟后台程序的运行,在通过线程运行完毕时,关闭这个加载中的动画对话框。

以下的程序范例中一个按钮,单击后开始线程的周期,显示ProgressDialog,最后当线程运行完毕时,结束ProgressDialog对话窗口。

 

具体程序如下

package com.sharandroid.ex3;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ex3_18 extends Activity {
 
   private Button mButton1;
   private TextView mTextView1;
   public ProgressDialog myDialog = null;
  
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mButton1 =(Button) findViewById(R.id.myButton1);
        mTextView1 = (TextView) findViewById(R.id.myTextView1);
        mButton1.setOnClickListener(myShowProgressBar);
       
    }
   
    Button.OnClickListener myShowProgressBar = new Button.OnClickListener()
    {
      public void onClick(View arg0)
      {
        final CharSequence strDialogTitle = getString(R.string.str_dialog_title);
        final CharSequence strDialogBody = getString(R.string.str_dialog_body);
       
       
// 显示Progress对话框
        myDialog = ProgressDialog.show
                   (
                     ex3_18.this,
                     strDialogTitle,
                     strDialogBody,
                     true
                   );
       
        mTextView1.setText(strDialogBody);
       
       
new Thread()
        {
          public void run()
          {
            try
            {
            
  /* 在这里写上后台代码运行程序 */
              /* 暂停3秒为实例 */
              sleep(3000);
            }
            catch (Exception e)
            {
              e.printStackTrace();
            }
            finally
            {
             
// 卸载所创建的myDialog对象
              myDialog.dismiss();
            }
          }
       
}.start(); /* 开始运行线程 */
      } /*End: public void onClick(View arg0)*/
    };
}

 

还有其他的ProgressDialog可以设置,具体参考书上。

 

3.21Android变脸  主题(theme)的实现

Android更加可以针对每个Activity、前景、背景,以及透明度等进行设置,下面是个简易的Theme(主题)来整合样式应用。

首先在values下新建一个style.xml

在主题设置文件中,已经预先设置好了Theme、Theme.Translucent、Theme.Transparent,以及TextAppearance.Theme.PlainText等4种主题,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 
<!-- 基礎應用程式主題,為預設主題 -->
  <style name="Theme" parent="android:Theme">
  </style>

  <!--
     變更應用程式的主題,使之具有translucent背景
  -->
  <style name="Theme.Translucent">
 
    <item name="android:windowBackground">
    @drawable/translucent_background
    </item>
   
    <item name="android:windowNoTitle">false</item>
    <item name="android:colorForeground">@drawable/blue</item>
    <item name="android:colorBackground">@drawable/white</item>
  </style>
 
 
<!--
     變更應用程式的主題,使之具有不同顏色背景且具有translucent背景
  -->
  <style name="Theme.Translucent2">
 
    <item name="android:windowBackground">
    @drawable/pink
    </item>
   
    <item name="android:windowNoTitle">false</item>
    <item name="android:colorForeground">@drawable/darkgreen</item>
    <item name="android:colorBackground">@drawable/pink</item>
  </style>
 
 
<!--
     變更應用程式的主題,使之具有透明transparent背景
  -->
  <style name="Theme.Transparent">
   
    <item name="android:windowBackground">
    @drawable/transparent_background
    </item>
   
    <item name="android:windowNoTitle">true</item>
    <item name="android:colorForeground">@drawable/blue</item>
    <item name="android:colorBackground">@drawable/pink</item>
  </style>
 
  <style name="TextAppearance.Theme.PlainText"
       parent="android:TextAppearance.Theme">
    <item name="android:textStyle">normal</item>
  </style>
</resources>

主程序如下所示

public class ex3_21 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
       
   
     /*
         * 应用透明背景的主题
         * setTheme(R.style.Theme_Transparent);
        */
       
  
      /*
         * 应用布景主题1
         * setTheme(R.style.Theme_Translucent);
        */
       
       
/*
         * 应用布景主题2
        */
        setTheme(R.style.Theme_Translucent2);
       
        setContentView(R.layout.main);
    }
}

 

还可以直接在Android中的

Mainfest.xml这个全局设置文件中,直接定义主题,方法如下,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="
http://schemas.android.com/apk/res/android"
      package="com.sharpandrio">

<activity class="AddRessItem"

     android:label="@string/str_text_view1"

    android:theme="@android:style/Theme.Translucent"/>

</mainfest>

 

 

 

 

 

 

 

 

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条