用户界面的设计还有其他的一些应用,如下面的应用:
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条评论)
登录后参与讨论