Android经典教材:UI 的基本外形和控制


UI 的基本外形和控制 1 控件和基本事件的响应 2 键盘事件的响应 3 运动事件的处理 4 屏幕间的跳转和事件的传递 5 菜单的使用 6 弹出对话框 7 样式的设置 1 控件和基本事件的响应 对于 Android 的应用程序, UI 元素 (通常称之为控件 , 在 Android 中称之为 View )是其构建 UI 的基础。 相关的两个要点:  如何得到 xml 中的控件的句柄  如何设置控件的行为 控制程序的 3 种实现方式 public class TestEvent1 extends Activity { private static final String TAG = "TestEvent1"; public TestEvent1() { } @Override public void onCreate(Bundle savedInstanceState) { 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(new OnClickListener() { public void onClick(View v) { Text.setBackgroundColor(Color.RED); } } ); Button2.setOnClickListener(new OnClickListener() { public void onClick(View v) { Text.setBackgroundColor(Color.GREEN); } } ); } } public class TestEvent2 extends Activity implements OnClickListener { private static final String TAG = "TestEvent2"; private TextView mText; private Button mButton1; private Button mButton2; public TestEvent2() { } @Override public void onCreate(Bundle savedInstanceState) { 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 implements OnClickListener { public void onClick(View v) { mText.setBackgroundColor(Color.RED); } } class Button2_OnClickListener implements OnClickListener { public void onClick(View v) { mText.setBackgroundColor(Color.GREEN); } } @Override public void onCreate(Bundle savedInstanceState) { 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 元素都继承的这个类,同族的函数包 括: void setOnClickListener(View.OnClickListener l); void setOnCreateContextMenuListener(View.OnCreateContextMenuListener l); void setOnFocusChangeListener(View.OnFocusChangeListener l); void setOnKeyListener(View.OnKeyListener l); void setOnLongClickListener(View.OnLongClickListener l); void setOnTouchListener(View.OnTouchListener l); 2 键盘事件的响应 在应用的程序的控制方面,更多的使用 的是屏幕上的控件,但是有的时候也需要直 接对键盘事件来进行响应。键盘是 Android 中主要的输入设备,对按键的响 应的处理是响应之间在程序中使用键盘的核 心内容。 按键信息: 按键码、按键的动作(抬起、按下) 、重复信息、扫描码码。 使用上键和右键增加图片的 Alpha 值,使用下键和左键减少图片的 Alpha 值 布局文件: 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); } } final int getAction() // 获得按键的动作 final int getFlags() // 获得标志 final int getKeyCode() // 获得按键码 final int getRepeatCount() // 获得重复的信息 final int getScanCode() // 获得扫描码 onKeyDown() 函数来获得按键的事件,同 类的函数还包括 onKeyUp() 函数,其参数 int keyCode 为按键码, KeyEvent msg 表示按键 事件的消息(其中包含了更详细的内容)。 KeyEvent 主要包含以下一些接口: 3 运动事件的处理 触摸屏( TouchScreen )和滚动球 ( TrackBall )是 Android 中除了键盘 之外的主要输入设备。如果需要使用触摸屏 和滚动球,主要可以通过使用运动事件 ( MotionEvent )用于接收它们的信息 。 触摸屏和滚动球事件主要通过实现以下 2 个函数来接收: public boolean onTouchEvent(MotionEvent event) public boolean onTrackballEvent(MotionEvent event) 显示当前的 MotionEvent 的动作和位置 布局文件: 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 extends Activity { 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(MotionEvent event) { 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 完成这 个动作。 Intent (Action / Data) 启动的过程 startActivity () startActivityForResult () UI UI 屏幕1 (Activity) UI UI UI 屏幕2 (Activity) UI 返回信息 示例程序: Forward ( ApiDemo => App=>Activity=>Forward ) 源文件: com/example/android/apis/app/Forward.java com/example/android/apis/app/ForwardTarget.java 布局资源文件: forward_target.xml forwarding.xml public void onClick(View v) {. Intent intent = new Intent(); intent.setClass(Forwarding.this, ForwardTarget.class); startActivity(intent); finish(); } JAVA 源文件 Forward.java : 知识点: 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 static final private int GET_CODE = 0; private OnClickListener mGetListener = new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(ReceiveResult.this, SendResult.class); startActivityForResult (intent, GET_CODE); } }; JAVA 源文件 ReceiveResult.java : public void onClick(View v) { setResult (RESULT_OK, (new Intent()).setAction("Corky!")); finish(); } JAVA 源文件 SendResult.java : 5 菜单的使用 菜单是屏幕中比较独立的一个元素,它和普 通的控件略有不同,很多 GUI 系统都对菜单有单 独的接口和运作方式。 在 Android 中具有单独接口,用于在活动中 使用菜单。菜单的相关接口: public boolean onCreateOptionsMenu(Menu menu) public boolean onOptionsItemSelected(MenuItem item) 使用一个菜单来控制按钮的背景颜色 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(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.testmenu); mButton = (Button) findViewById(R.id.color_button); } JAVA 源文件 ReceiveResult.java : @Override public boolean onCreateOptionsMenu(Menu menu) { 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 boolean onOptionsItemSelected(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); } } JAVA 源文件 ReceiveResult.java : 6 弹出对话框 弹出式对话框不同于一个活动,它通常用于 简单的功能。 对话框的父类是 android.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 1. 提示信息和两个按钮的对话框 2. 提示信息和三个按钮的对话框 3. 列表项对话框 4. 单选项和按钮对话框 5. 复选项和按钮对话框 6. 文本的按键对话框(使用布局文 件) 对话框的类为 android.app.Dialog ,通过 android.app.AlertDialog.Builder 类来建立,在建立 的过程中可以进行多项设置。  setIcon() 和 setTitle() :用于设置图标和标题; setMessage() :用于设置提示信息; setPositiveButton() 、 setNeutralButton() 和 setNegativeButton() :用于设置左、中、右按钮; setSingleChoiceItems() 和 setMultiChoiceItems() :用于设置单选项和复选项; setView() :用于设置一个 View 作为对话框的内容。 AlertDialog.Builder 的各个函数的 返回类型均为 android.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 AndroidManifest.xml 示例程序: TranslucentActivity 和 TranslucentBlurActivity 源文件: com/example/android/apis/app/TranslucentActivity.java com/example/android/apis/app/TranslucentBlurActivity.java 样式文件: values/styles.xml AndroidManifest.xml public class TranslucentBlurActivity extends 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); } } TranslucentBlurActivity.java
还剩52页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 8 人已下载

下载pdf

pdf贡献者

whuzhang

贡献于2012-02-12

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf