Android--UI的基本外形和控制

1 控件和基本事件的响应

2 键盘事件的响应

3 运动事件的处理

4 屏幕间的跳转和事件的传递

5 菜单的使用

6 弹出对话框

7 样式的设置

1 控件和基本事件的响应

对于Android的应用程序,UI元素(通常称之为控件,在Android中称之为View)是其构建UI的基础。

相关的两个要点:

? 1〉如何得到xml中的控件的句柄

? 2〉如何设置控件的行为

控制程序的3种实现方式:

public class TestEvent1 extends Activity {

private static final String TAG ="TestEvent1";

public TestEvent1() {

}

@Override

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.testevent);

final TextView Text = (TextView)findViewById(R.id.text1);

final Button Button1 = (Button)findViewById(R.id.button1);

final Button Button2 = (Button)findViewById(R.id.button2);

Button1.setOnClickListener(newOnClickListener() {

public void onClick(View v) {

Text.setBackgroundColor(Color.RED);

}

} );

Button2.setOnClickListener(newOnClickListener() {

public void onClick(View v) {

Text.setBackgroundColor(Color.GREEN);

}

} );

}

}

public class TestEvent2 extends Activityimplements OnClickListener {

private static final String TAG ="TestEvent2";

private TextView mText;

private Button mButton1;

private Button mButton2;

public TestEvent2() { }

@Override

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.testevent);

mText = (TextView)findViewById(R.id.text1);

mButton1 = (Button)findViewById(R.id.button1);

mButton1.setOnClickListener(this); // 设置监听的类

mButton2 = (Button)findViewById(R.id.button2);

mButton2.setOnClickListener(this); // 设置监听的类

}

public void onClick(View v) {

Log.v(TAG, "onClick()");

switch(v.getId()){ // 区分不同的控件

case R.id.button1:

mText.setBackgroundColor(Color.RED);

break;

case R.id.button2:

mText.setBackgroundColor(Color.GREEN);

break;

default:

break;

}

}

}

public class TestEvent3 extends Activity{

private static final String TAG ="TestEvent3";

private TextView mText;

private Button1_OnClickListener mListener1= new

Button1_OnClickListener();

private Button2_OnClickListener mListener2= new

Button2_OnClickListener();

public TestEvent3() {

}

class Button1_OnClickListener implementsOnClickListener {

public void onClick(View v) {

mText.setBackgroundColor(Color.RED);

}

}

class Button2_OnClickListener implementsOnClickListener {

public void onClick(View v) {

mText.setBackgroundColor(Color.GREEN);

}

}

@Override

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.testevent);

mText = (TextView)findViewById(R.id.text1);

final Button mButton1 = (Button) findViewById(R.id.button1);

final Button mButton2 = (Button)findViewById(R.id.button2);

mButton1.setOnClickListener(mListener1);// 设置监听者的类

mButton2.setOnClickListener(mListener2);// 设置监听者的类

}

}

要点:

? 使用findViewById获取XML中UI元素的句柄

? 使用setOnXXXListener()设置事件处理函数

setOnClickListener是类android.view.View类的函数,每一个UI元素都继承的这个类,同族的函数包

括:

voidsetOnClickListener(View.OnClickListener l);

voidsetOnCreateContextMenuListener(View.OnCreateContextMenuListener l);

voidsetOnFocusChangeListener(View.OnFocusChangeListener l);

void setOnKeyListener(View.OnKeyListenerl);

voidsetOnLongClickListener(View.OnLongClickListener l);

voidsetOnTouchListener(View.OnTouchListener l);

2 键盘事件的响应

在应用的程序的控制方面,更多的使用的是屏幕上的控件,但是有的时候也需要直

接对键盘事件来进行响应。键盘是Android中主要的输入设备,对按键的响应的处理是响应之间在程序中使用键盘的核心内容。

按键信息:

按键码、按键的动作(抬起、按下)、重复信息、扫描码。

[img,500,59]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/X6EN%7D7T8S_1NOVVU79A5(OQ.jpg[/img]

使用上键和右键增加图片的Alpha值,使用下键和左键减少图片的Alpha值

布局文件:

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/screen"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

<TextViewandroid:id="@+id/alphavalue"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"/>

<ImageViewandroid:id="@+id/image"

android:src="@drawable/robot"

android:layout_gravity="center"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

</LinearLayout>

代码:

package com.android.basicapp;

import android.app.Activity;

import android.content.Context;

import android.graphics.*;

import android.os.Bundle;

import android.util.Log;

import android.view.KeyEvent;

import android.view.View;

import android.widget.TextView;

import android.widget.ImageView;

public class TestKeyEvent extends Activity{

private static final String TAG ="TestKeyEvent";

private ImageView mImage;

private TextView mAlphavalueText;

private int mAlphavalue;

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.testkeyevent);

mImage = (ImageView)findViewById(R.id.image);

mAlphavalueText = (TextView)findViewById(R.id.alphavalue);

mAlphavalue = 100;

mImage.setAlpha(mAlphavalue);

mAlphavalueText.setText("Alpha =" + mAlphavalue*100/0xff + "%");

}

@Override

public boolean onKeyDown(int keyCode,KeyEvent msg){

Log.v(TAG, "onKeyDown: keyCode ="+ keyCode);

Log.v(TAG, "onKeyDown: String =" + msg.toString());

switch (keyCode) {

case KeyEvent.KEYCODE_DPAD_UP:

case KeyEvent.KEYCODE_DPAD_RIGHT:

mAlphavalue += 20;

break;

case KeyEvent.KEYCODE_DPAD_DOWN:

case KeyEvent.KEYCODE_DPAD_LEFT:

mAlphavalue -= 20;

break;

default:

break;

}

if(mAlphavalue>=0xFF)mAlphavalue =0xFF;

if(mAlphavalue<=0x0)mAlphavalue = 0x0;

mImage.setAlpha(mAlphavalue);

mAlphavalueText.setText("Alpha =" + mAlphavalue*100/0xff + "%");

return super.onKeyDown(keyCode, msg);

}

}

onKeyDown()函数来获得按键的事件,同类的函数还包括onKeyUp()函数,其参数intkeyCode为按键码,KeyEvent msg表示按键

事件的消息(其中包含了更详细的内容)。

KeyEvent主要包含以下一些接口:

final int getAction() // 获得按键的动作

final int getFlags() // 获得标志

final int getKeyCode() // 获得按键码

final int getRepeatCount() // 获得重复的信息

final int getScanCode() // 获得扫描码

3 运动事件的处理

触摸屏(TouchScreen )和滚动球(TrackBall )是Android中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球,主要可以通过使用运动事件(MotionEvent )用于接收它们的信息。 触摸屏和滚动球事件主要通过实现以下2个函数来接收:

public boolean onTouchEvent(MotionEventevent)

public booleanonTrackballEvent(MotionEvent event)

显示当前的MotionEvent 的动作和位置

[img,500,90]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/Y6A5B_%25~71%5BIGG1N6N1Z(%60L.jpg[/img]布局文件:

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"android:layout_height="fill_parent"

android:orientation="vertical">

<TextViewandroid:id="@+id/action"

android:textSize = "20sp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

<TextViewandroid:id="@+id/postion"

android:textSize = "20sp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

</LinearLayout>

源代码文件:

package com.android.basicapp;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.util.Log;

import android.view.MotionEvent;

import android.widget.TextView;

public class TestMotionEvent extendsActivity {

private static final String TAG ="TestMotionEvent";

TextView mAction;

TextView mPostion;

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.testmotionevent);

mAction =(TextView)findViewById(R.id.action);

mPostion =(TextView)findViewById(R.id.postion);

}

@Override

public boolean onTouchEvent(MotionEventevent) {

int Action = event.getAction();

float X = event.getX();

float Y = event.getY();

mAction.setText("Action = "+Action);

mPostion.setText("Postion =("+X+","+Y+")");

return true;

}

}

MotionEvent 是用于处理运动事件的类,这个类中可以获得动作的类型、动作的坐标。 在Android 2.0 版本之后,MotionEvent 中还包含了多点触摸的信息,当有多个触点同时起作用的时候,可以获得触点的数目和每一个触点的坐标。

4 屏幕间的跳转和事件的传递

Android的每一个屏幕基本就是一个活动(Activity)。在屏幕之间的切换事实上就是在活动间互相调用的的

过程,Android使用Intent完成这个动作。

[img,750,50]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/3RVH@VB4CC(PX%606U%25WQG0NO.jpg[/img]

示例程序:Forward

(ApiDemo =>App=>Activity=>Forward)

源文件:

com/example/android/apis/app/Forward.java

com/example/android/apis/app/ForwardTarget.java

布局资源文件:

forward_target.xml

forwarding.xml

<activity android:name=“.app.Forwarding"android:label="@string/activity_forwarding">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN" />

<categoryandroid:name="android.intent.category.SAMPLE_CODE" />

</intent-filter>

</activity>

<activity android:name=“.app.ForwardTarget">

</activity>

[img,750,61]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/3V4(~%7D2AJ7U%60GQ)0G%7BU9%7BBC.jpg[/img]

JAVA源文件Forward.java:

public void onClick(View v)

{.

Intent intent = new Intent();

intent.setClass(Forwarding.this,ForwardTarget.class);

startActivity(intent);

finish();

}

知识点:

Intent是Android类的子类,用于启动活

动,服务或者消息接收器。

示例程序:ReceiveResult

(ApiDemo =>App=>Activity=>ReceiveResult )

源文件:

com/example/android/apis/app/ReceiveResult.java

com/example/android/apis/app/SendResult.java

布局资源文件:

receive_result.xml

send_result.xml

<activityandroid:name=".app.ReceiveResult"

android:label="@string/activity_receive_result">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN" />

<categoryandroid:name="android.intent.category.SAMPLE_CODE" />

</intent-filter>

</activity>

<activityandroid:name=".app.SendResult">

</activity>

[img,750,46]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/BP76W9%60%5DMR%5D_T6QLPA5~I%5BN.jpg[/img]

JAVA源文件ReceiveResult.java:

static final private int GET_CODE = 0;

private OnClickListener mGetListener = newOnClickListener() {

public void onClick(View v) {

Intent intent = newIntent(ReceiveResult.this, SendResult.class);

startActivityForResult (intent, GET_CODE);

}

};

JAVA源文件SendResult.java:

public void onClick(View v)

{

setResult (RESULT_OK, (newIntent()).setAction("Corky!"));

finish();

}

5 菜单的使用

菜单是屏幕中比较独立的一个元素,它和普通的控件略有不同,很多GUI系统都对菜单有单独的接口和运作方式。 在Android中具有单独接口,用于在活动中使用菜单。菜单的相关接口:

public boolean onCreateOptionsMenu(Menumenu)

public booleanonOptionsItemSelected(MenuItem item)

[img,750,61]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/Z%25FGMEFAY3924%7B8%7BLQA3L%7DF.jpg[/img]

使用一个菜单来控制按钮的背景颜色

JAVA源文件ReceiveResult.java:

package com.android.basicapp;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.graphics.Color;

import android.view.View;

import android.view.Menu;

import android.view.Gravity;

import android.view.MenuItem;

import android.widget.Button;

import android.widget.TextView;

import android.view.View.OnClickListener;

import android.util.Log;

public class TestMenu extends Activity {

private static final String TAG ="TestMenu";

private Button mButton;

public static final int RED_MENU_ID =Menu.FIRST;

public static final int GREEN_MENU_ID =Menu.FIRST + 1;

public static final int BLUE_MENU_ID =Menu.FIRST + 2;

public TestMenu() { }

@Override

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.testmenu);

mButton = (Button)findViewById(R.id.color_button);

}

@Override

public boolean onCreateOptionsMenu(Menumenu) {

super.onCreateOptionsMenu(menu);

menu.add(0, RED_MENU_ID, 0, R.string.red);

menu.add(0, GREEN_MENU_ID, 0,R.string.green);

menu.add(0, BLUE_MENU_ID, 0,R.string.blue);

return true;

}

@Override

public booleanonOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case RED_MENU_ID:

mButton.setBackgroundColor(Color.RED);

mButton.setText(R.string.red);

return true;

case GREEN_MENU_ID:

mButton.setBackgroundColor(Color.GREEN);

mButton.setText(R.string.green);

return true;

case BLUE_MENU_ID:

mButton.setBackgroundColor(Color.BLUE);

mButton.setText(R.string.blue);

return true;

}

return super.onOptionsItemSelected(item);

}

}

6 弹出对话框

弹出式对话框不同于一个活动,它通常用于简单的功能。 对话框的父类是ndroid.app.Dialog,通过构建类android.app.AlertDialog来实现弹出式对话框,可以使用AlertDialog.Builder和不同的参数来构建对话框。菜单也Android的GUI中可以灵活使用元素,类为android.view.Menu

对话框示例程序:

(ApiDemo =>App=>Dialog )

源文件:

com/example/android/apis/app/AlertDialogSamples.java

布局资源文件:

alert_dialog.xml

<activityandroid:name=".app.AlertDialogSamples"

android:label="@string/activity_alert_dialog">

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.SAMPLE_CODE" />

</intent-filter>

</activity>

[img,750,58]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/%5DZ%2551%5DR%7DVL6)3@$JO%7D8M%7DG8.jpg[/img]

[img,750,45]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/7VV%7B4UL(OANN@AX%60NU_~XA8.jpg[/img]

[img,750,48]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/IHI%25V5J4KJIJLKIVJ$4QG0X.jpg[/img]

对话框的类为android.app.Dialog,通过android.app.AlertDialog.Builder类来建立,在建立的过程中可以进行多项设置。

?? setIcon()和setTitle():用于设置图标和标题;

?? setMessage():用于设置提示信息;

?? setPositiveButton()、setNeutralButton()和setNegativeButton():用于设置左、中、右按钮;

?? setSingleChoiceItems()和setMultiChoiceItems():用于设置单选项和复选项;

?? setView():用于设置一个View作为对话框的内容。

AlertDialog.Builder的各个函数的返回类型均为droid.app.AlertDialog.Builder,也就是这个类本身,因此可以使用如下的方式进行连续调用来设置更多的内容。

以上的各个函数设置完成后调用create()函数返回android.app.AlertDialog类,这个类表示一个可以使用的对话框。

7 样式的设置

通过在AndroidManifest.xml中设置样式,也可以控制活动的外观。所设置的样式可以基于预定的样式,也可以自定义样式。预定的样式在framework中定义,自定义样式在应用程序中定义。

示例程序:

DialogActivity 和CustomDialogActivity

源文件:

com/example/android/apis/app/DialogActivity.java

com/example/android/apis/app/CustomDialogActivity.java

样式文件:

values/styles.xml

<stylename="Theme.CustomDialog"parent="android:style/Theme.Dialog">

<itemname="android:windowBackground">@drawable/filled_box</item>

</style>

AndroidManifest.xml

<activity android:name=".app.DialogActivity"

android:label="@string/activity_dialog"

android:theme="@android:style/Theme.Dialog“>

<intent-filter>

<actionandroid:name="android.intent.action.MAIN" />

<categoryandroid:name="android.intent.category.SAMPLE_CODE" />

</intent-filter>

</activity>

<activityandroid:name=".app.CustomDialogActivity"

android:label="@string/activity_custom_dialog"

android:theme="@style/Theme.CustomDialog“>

<intent-filter>

<actionandroid:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.SAMPLE_CODE"/>

</intent-filter>

</activity>

[img,750,59]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/1RJO%7D%7D3_O@%25MH7F8~)(%60%7DJC.jpg[/img]

示例程序:

TranslucentActivity 和TranslucentBlurActivity

源文件:

com/example/android/apis/app/TranslucentActivity.java

com/example/android/apis/app/TranslucentBlurActivity.java

样式文件:

values/styles.xml

<stylename="Theme.Transparent">

<itemname="android:windowIsTranslucent">true</item>

<itemname="android:windowAnimationStyle">@android:style/Animation.Translucent</item>

<itemname="android:windowBackground">@drawable/transparent_background</item>

<itemname="android:windowNoTitle">true</item>

<itemname="android:colorForeground">#fff</item>

</style>

AndroidManifest.xml

<activityandroid:name=".app.TranslucentActivity"

android:label="@string/activity_translucent"

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

<intent-filter>

<actionandroid:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.SAMPLE_CODE"/>

</intent-filter>

</activity>

<activityandroid:name=".app.TranslucentBlurActivity"

android:label="@string/activity_translucent_blur"

android:theme="@style/Theme.Transparent“>

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.SAMPLE_CODE" />

</intent-filter>

</activity>

TranslucentBlurActivity.java

public class TranslucentBlurActivityextends Activity {

protected void onCreate(Bundle icicle) {

super.onCreate(icicle);

getWindow().

setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,

WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

setContentView(R.layout.translucent_background);

}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值