文章目录
Android应用程序的构成
目录结构
Android应用程序主要由三部分组成:应用程序描述文件.xml,各种资源文件,应用程序源代码.java。
-
src——存放Android应用程序中的所有Java源码
-
AndroidManifest.xml
-
项目的系统控制文件,每个Android项目必须有这个文件,位于项目根目录下。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.chapter322_progressbar"> 声明应用程序的包名 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
-
-
res——存放资源文件
-
drawable目录:存放一些图片资源
-
layout目录:存放应用程序的布局文件;文件类型为xml,用xml元素来设定屏幕布局;每个xml文件都包含整个或部分屏幕的视图资源。
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 设置布局样式 xmlns:android="http://schemas.android.com/apk/res/android" xml命名空间声明,每一个android布局文件的最外层标签必须由这个属性 xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" 设置控件id并添加到R.java文件中 android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:padding="16dp" android:text="@string/hello" 设置控件文本位strings.xml中的常量hello app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> <Button android:id="@+id/button_hand" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="手动增加进度" app:layout_constraintEnd_toStartOf="@+id/progressBar2" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/progressBar" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
values目录:存放所有xml格式的资源描述文件,例如string.xml, colors.xml, styles.xml, demens.xml(尺寸)和arrys.xml(数组)等描述文件
strings.xml:
<resources> 定义资源的标签 <string name="app_name">chapter322-progressbar</string> 定义字符串常量 </resources>
colors.xml:
<?xml version="1.0" encoding="utf-8"?> 声明xml的版本以及编码方式 <resources> <color name="colorPrimary">#6200EE</color> 定义颜色资源,颜色值由RGB(三位十六进制数) <color name="colorPrimaryDark">#3700B3</color> 或RRGGBB(6位十六进制数)表示,以"#"开头 <color name="colorAccent">#03DAC5</color> </resources>
dimens.xml:
通常用于创建布局常量,在样式和布局资源中定义边界、高度、尺寸、大小等 使用<demen></demen>指定一个维度资源 常用维度定义单位如下:px(像素)、in(英寸)、mm(毫米)、pt(磅):1.72英寸、dip、sp
styles.xml:
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 定义名称位AppTheme的样式 <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="BaseText"> <item name="android:textSize">14sp</item> 定义字体大小 <item name="android:textColor">#111</item> 定义字体颜色 </style> </resources>
-
注意:
res目录文件中的所有文件名只能是“a"“z”,"0"“9”,"_"字符命名,不能包含大写字符,否则会导致错误。
-
视图——Activity
-
什么是Activity?
- Activity是一个可以与用户交互的组件,每个视图通过继承系统AppCompatActivity类的子类来实现;
- 从功能上来说,它作为应用程序的界面框架,负责动态加载各种用户界面视图,实现底层的消息传递等,不能简单地把Activity简单视为一个屏幕,而应把它看作一个功能强大的界面管理者,它负责调度各种界面视图,帮助开发人员完成Android应用与用户之间的UI交互。
- 从逻辑上来说,Activity是Android应用的组成部分,一个Android应用可以包含多个Activity(当然还包含其他类型的组件如Service、Content Provider等)
-
AppCompatActivity类
- onCreate:视图第一次启动时调用,完成活动初始化工作
- onStart:触发此方法将活动展现给用户
- onResume:当一个活动失去焦点时,触发该方法
- onPause:当活动转入后台运行时触发该方法,需要将活动的状态持久化
- onStop:当一个活动不再需要展示触发该方法。内存紧张,系统会直接结束活动
- onDestroy:当活动销毁的时候,触发该方法
- onRestart:重新启动Activity时被调用,该方法总是再onStart方法后执行
-
Android生命周期流程图和状态图
- Running(运行):在屏幕前台(位于当前任务堆栈的顶部)
- Paused(暂停):失去焦点但仍然对用户可见(覆盖Activity是透明或未完全遮挡)
- Stopped(停止):完全被另一个视图覆盖
- Destroyed(销毁):Activity完全被销毁
-
其他:
- 如果一个程序有多个Activity,则需要再AndroidManifest.xml配置文件中将其中一个Activity标记为启动Activity,以启动程序。
-
第一个Activity程序(运行结果参照Android应用程序开发教程Android Studio版——100页)
- MainActivity.java
public class MainActivity extends AppCompatActivity { String msg = "Android:"; /** Called when the Activity is firest created. */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** * Activity(活动)通过setContentView方法加载工程res/layout目录下的xml文件,从而调用UI组件。 */ setContentView(R.layout.activity_main); Log.d(msg, "The onCreat() event."); } @Override protected void onStart() { super.onStart(); Log.d(msg, "The onStart() event."); } @Override protected void onResume() { super.onResume(); Log.d(msg, "The onResume() event."); } @Override protected void onPause() { super.onPause(); Log.d(msg, "The onPause() event."); } @Override protected void onStop() { super.onStop(); Log.d(msg, "The onStop() event."); } @Override protected void onDestroy() { super.onDestroy(); Log.d(msg, "The onDestroy() event."); } }
- AcdroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app02"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 一个应用程序可以包含多个Activity(活动),但是每个Activity必须在AndroidManifest.xml配置文件中进行声明。 同时,主Activity还需要用<intent-filter>标签标明为MAIN动作和LAUNCHER类,否则用户无法在手机屏幕上看见应用程序的APP图标。 --> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Android UI 设计
UI 布局
布局方式是指一组View元素如何布局,准确地说就是一个ViewGroup中的View如何布局。
Android UI布局一般使用布局管理器、ListView(列表视图)、GridView(网格视图)三种。
用户界面通过View和ViewGroup对象构建;Android中有很多种View和ViewGroup,她们都继承自View类;View对象是Android平台上表示用户界面的基本单元;
布局管理器
-
FrameLayout
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <!-- 添加剧中显示的安卓图标图片ImageView,将显示在最下层--> <ImageView android:src="@drawable/ic_launcher" android:layout_width="match_parent" android:layout_height="392dp" android:scaleType="fitCenter" android:layout_gravity="center_vertical" /> <!-- 添加居中显示的Frame Demo文字TextView,将显示在最少上层--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Frame Demo" android:textSize="30px" android:textStyle="bold" android:layout_gravity="left|bottom" android:gravity="center" /> </FrameLayout>
-
LinearLayout
以单一方向对其中的View对象进行排列显示,垂直排列时屏幕中将只有一列,水平排列时屏幕中将只有一行。
对于多个显示对象,线性布局保持他们之间的间隔以及互相对齐。
-
TableLayout
- 每个单元格内只显示一个View对象。
- 表格布局类每一行为一个TableRow对象,TableRow中可以添加显示对象,每添加一个显示对象为一列。
- 一个列的宽度由该列中最宽的那个单元确定;表格宽度由父容器决定。
- 布局中的空单元格可以向HTML那样跨越多个列。
-
RelativeLayout
-
通过指定View对象相对与其他显示对象或父级对象的相对位置来布局。
-
进行相对布局时要避免循环依赖。
-
-
AbsoluteLayout
- 允许以坐标方式指定View对象的具体位置,左上角的坐标为(0,0)。
- 每个对象都要通过计算其坐标的方式来定位和布局,较为麻烦耗时。
ListView(列表视图)
基础知识
ListView以垂直列表形式列出要显示的列表项目。
一般来说,ListView都是和Adapter(适配器)一起使用,数组数据或数据库数据都是通过Adapter把值传递给ListView组件。
实际上,Adapter将数据源中得到的数据传递给AdapterView(适配器视图),AdapterView将数据呈现在Spinner(列表选择框)、ListView(列表视图)、GrideView(网格视图)等UI组件中。
ListView和GrideView是AdapterView的子类。
Adapter的子类:ArraryAdapter(数组适配器)、BaseAdapter(基本适配器)、Cursor Adapter(游标适配器)、SimpleCursorAdapter(简单游标适配器)、SpinnerAdapter(列表适配器)和WrapperListAdapter(封装列表适配器)。
ListView常用属性
数组适配器
-
使用方法
-
示例:
/** * MainActivity.java */ public class MainActivity extends AppCompatActivity { //Array of Strings ... String[] mobileArray = {"Android", "IPhone", "oppo", "vivo", "huawei", "xlinx", "fpga"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //装配数据,ArrayAdapter<>(this,布局文件:描述的时列表的每一行的布局,数据) ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listview, mobileArray); //通过Id找到ListView列表 ListView listView = (ListView) findViewById(R.id.mobile_list); //将listview和adapter进行绑定 listView.setAdapter(adapter); } }
<!-- activity_main.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <ListView android:id="@+id/mobile_list" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
布局文件:列表中每行的布局
<!-- activity_listView.xml --> <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/label" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dip" android:textSize="16dip" android:textStyle="bold" > </TextView>
结果:
GridView(网格视图)
-
常用属性
-
通常使用ImageAdapter(图片适配器)为组件提供数据
-
示例:
-
显示图片
ImageAdapter.java
public class ImageAdapter extends BaseAdapter { private Context mContext; //Constructor public ImageAdapter(Context mContext) { this.mContext = mContext; } @Override public int getCount() { return mThumbIds.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); } else { imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return imageView; } //keep all Image in array public Integer[] mThumbIds = { R.drawable.sample1,R.drawable.sample2,R.drawable.sample3, R.drawable.sample1,R.drawable.sample2,R.drawable.sample3, R.drawable.sample1,R.drawable.sample2,R.drawable.sample3 }; }
MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GridView gridView = (GridView) findViewById(R.id.gridview); gridView.setAdapter(new ImageAdapter(this)); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="match_parent" android:layout_height="match_parent" android:columnWidth="90dp" android:numColumns="auto_fit" android:verticalSpacing="10dp" android:stretchMode="columnWidth" android:gravity="center" />
-
点击图片全屏显示
-
Android UI 控件
-
TextView(文本框)
- 包名:android.widget.TextView
- 向用户显示文本内容。
- TextView的背景色可以使用android:background属性设置;颜色常量使用“#RRGGBB”6位16进制数表示。
-
EditText(编辑框)
- 包名:android.widget.EditText;继承自TextView
- 向用户显示文本内容,并允许用户对文本进行编辑的控件。
-
AutoCompleteTextView(自动填充文本)
-
Button(普通按钮)
- 包名:android.widget.Button;继承自TextView
- Button的背景可以是背景颜色,也可以是背景图片。
- 当用户对按钮按下或单击之后,按钮控件就会触发onClick事件,所以需要对按钮设置setOnClickListener事件监听。
-
ImageButton(图片按钮)
-
继承自ImageView
-
功能与Button控件一致。主要区别在于ImageButton中没有text属性,即按钮只显示图片不显示文本。
-
控件中设置按钮显示图片时可通过android:src属性,代码中动态设置图片使用setImageResource(int)方法来实现。
-
ImageButton与Button一样都具有背景颜色,为了不影响图片显示,一般设置背景色为透明或者其他图片。
-
案例设计(用于描述按钮被按下和未按下的两种状态显示的不同的照片)
-
-
CheckBox(复选框)
-
ToggleButton(开关按钮)
-
RadioButton(单选按钮)与RadioGroup(按钮组)
-
ImageView(图片)
- 负责显示图片,还可以执行一些其他操作:设置alpha值、调整图片尺寸等。
- 图片来源:资源文件ID、drawable目录中的图片对象、Content Provider中的URI等。
-
AnalogClock和DigitalClock
- 都位于android.widget包下
- AnalogClock以模拟时钟指针形式显示时间。
- DigitalClock以数字形式显示时间。
-
使用进度对话框ProgressDialog类创建ProgressBar(进度条)
-
Spinner(列表选择框)
-
TimePicker(时间拾取器)和DatePicker(日期拾取器)
Android应用核心Intent和Filters
-
Intent(意图)是一个将要执行操作的抽象描述。
-
Android的3个核心组件Activity(活动)、Service(服务)和BroadcastReceiver(广播接收器)都需要使用Intent通信。
-
Intent用于相同或者不同应用程序组件间的后期运行时绑定。
Intent的各属性
-
Component(组件)
- 组件名称是要处理这个Intent的组件的名称。
- 组件名是可选的,如果设置了,这个Intent对象会被传递到指定的类,如果没有设置,则在AndroidManifest.xml中,通过使用IntentFilter来找与该Intent最合适的组件。
- 组件名字通过setComponent(), setClass(), 或者setClassName()来设置,通过方法getComponent()来读取。
-
Action(动作)
-
一个将被执行的动作的字符串命名,或者对广播意图而言,是发生并报告的动作。这个Intent类定义了一些动作常量,用大写英文单词和下划线组成。
-
-
Category(类别)
- 类别是关于Intent中action要执行的动作的附加描述,他是一个字符串。可以把任意数目的类别描述放到一个Intent对象中。
- 通过addCategory()方法在一个Intent对象中添加一个类别,通过removeCategory()方法删除之前添加的类别,通过getCategories()方法可以获得当前对象的所有类型。
-
Data(数据)和Type(类型)
- 数据(Data)为动作提供要操作的信息,用指向数据的一个资源标识符(URI)表示。
- 不同动作伴随着不同的数据规格(Type)。
-
附加信息(Extra)
- 附加信息就是要递交给Intent处理组件的附加信息键-值对。
- 例如:HEADSET_PLUG_ACTION有一个状态附加字段表明耳机有没有插着。
- Intent对象中有一系列的put…()方法来插入各种不同附加数据,一系列get…()方法来读取数据。这些方法与Bundle对象的方法相似。
- 事实上,附加信息就是可以当作一个Bundle对象,通过使用putExtras()和getExtras()方法类插入和读取。
-
标志
- 表示(flag)是各种类型的标志。
- 许多标志用来指示Android系统该如何去加载一个Activity和启动后如何对待他。
Intent过滤器
- 意图过滤器只对隐式意图起作用。
- 可以用Java代码来设置IntentFilter类的一个实例,但更多的是使用应用程序清单AndroidManifest.xml中设置标签,在其中设置需要过滤的内容。
Intent解析
通过比较Intent对象内容和意图过滤器,找到相匹配的目标组件。
如果一个组件没有任何意图过滤器,那么它只能就收显式意图;一个带过滤器的组件可同时接收显式意图和隐式意图。
- 检查Action
- 一个Intent只能设置一种Action,但是一个IntentFilter可以设置多个Action过滤。
- 当设置了很多Action过滤时,只要满足一个即可完成Action验证。
- IntentFilter没有声明任何Action,那么任何一个Action都不能与之匹配;一个Intent中没有任何Action,则可以与任何含有Action的IntentFilter匹配成功。
- 检查Data
- 对URI进行监测、对数据类型进行监测
- 数据URI又被分为三部分:scheme, authority, path,只有这三种信息完全匹配时,Data才验证成功。
- 检查Category
- 在IntentFilter中同样可以设置多个Category。
- 当Intent中的Category与IntentFilter中的一个Category完全匹配时,此Category便会通过,而其他Category并不会受影响。
通信示例:
点击按钮跳转到第二个Acitvity,并传递相应信息
private void intentToSecond() {
Intent intent1 = new Intent(MainActivity.this, SecondActivity.class);
intent1.putExtra("activitymain", "从AcitvityMain传入");
startActivityForResult(intent1,REQUEST_CODE);
}
第二个Activity中,读取并显示
private void initView() {
String data = null;
Bundle extras = getIntent().getExtras();
if (extras != null) {
data = extras.getString("activitymain");
}
setTitle("现在时在SecondActivity里:"+data);
}
第二个Acitvity中点击按钮,返回第一个Acitvity并传值
private void clickButton() {
Bundle bundle = new Bundle();
bundle.putString("store","来自SecondActivity返回");
Intent intent2 = new Intent();
intent2.putExtras(bundle);
setResult(RESULT_OK, intent2);
finish();
}
从第二个Activity返回到第一个Activity,并显示信息
//在第一个Activity中通过重写onActivityResult()实现
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_CANCELED) {
setTitle("取消");
} else if (resultCode == RESULT_OK) {
String temp = null;
Bundle extras = data.getExtras();
if (extras != null) {
temp = extras.getString("store");
}
setTitle("现在是在ActivityMain里:" + temp);
}
}
}
用户界面状态保存
当Activity实例与用户交互时,会产生一些状态信息:用户选取的值、光标的位置等;
如果此时该Activity进入“暂停”或“停止”状态时,需要保存这些临时状态信息。
- 使用SharePreferences对象
- SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些Activity的状态信息:字体、颜色、位置等
- 在Activity中重载窗口状态的参数SaveInstanceState一般使用SharedPreferences完成保存。
- 顾名思义,SharedPreferences是在同一个Package中进行共享的Preferences。SharedPreferences对象的访问权限是私有的。
- SharedPreferences处理的是键-值对二元组,支持常见的String、Long、Float、Interger、Boolean等数据类型。
- 使用Bundle对象
- 在Activity生命周期中的多个方法中,都使用Bundle对象来保存Activity相关的状态信息。如方法onCreate(), onSaveInstanceState(), onRestoreInstanceState()。
- Bundle对象封装数据也是键值对二元组,用Bundle绑定数据便于处理。所以利用他的数据封装能力,将要传递的数据或参数通过Intent对象来传递到不同的Activity之间,也是比较简单的方法。
- Bundle对象中的数据是保存在应用程序的上下文中的,如果应用程序推出,相应的上下文也就销毁了,Bundle对象也就不存在了。
- SharedPreferences和Bundle的区别
- SharePreferences是简单的存储持久化设置,将数据保存在一个xml文件中,常用于保存应用程序结束前的一些界面状态信息。
- Bundle是将数据传递到另一个上下文中或保存,或回复自己的状态的数据存储方式,常用于应用程序运行时。
Androd事件处理
响应用户动作的机制就是事件处理
## 基于回调机制的事件处理
-
概述:
回调机制实质是将事件的处理绑定在控件上,由图形用户界面控件自己处理事件。
回调不是由该方法的实现方直接调用,而是在特定事件或条件发生时,由另外一方通过一个接口来调用,用于对该事件或条件进行响应。
在Android平台中,每个View都有自己的处理事件的回调方法;当某个事件没有被任何一个View处理时,便会调用Activity中相应的回调方法。
-
onKeyDoown()
-
几乎所有View
-
捕获手机键盘被按下的事件
-
该方法的接口是KeyEvent.Callback中的抽象方法
-
public bolean onKeyDown(int keyCode, KeyEvent event)
-
参数:
keyCode:被按下的键值
event:按键事件的对象,包含事件的详细信息
返回值为true表示已经完整地处理了这个事件,并不希望其他回调方法再一次处理;false表示未完全处理,需要其他回调方法进一步处理,例如Activity中的回调方法。
-
-
onKeyUp()
- 捕获手机键盘抬起的事件
- 其他属性与onKeyDown()类似
-
onTouchEvent()
-
几乎所有View
-
捕获手机屏幕的触摸的事件
-
public boolean onTouchEvent(MotionEvet event)
-
该方法一般情况下会处理三种事件:
屏幕被按下:此时
MotionEvent.getAction()
的值为MotionEvent.ACTION_DOWN
屏幕被抬起:此时
MotionEvent.getAction()
的值为MotionEvent.ACTION_UP
屏幕被拖动:此时
MotionEvent.getAction()
的值为MotionEvent.ACTION_MOVE
-
-
onTrackballEvent()
- 轨迹球事件
-
onFocusChanged()
-
捕获焦点改变事件
-
只能再View中重写
-
protected void onFocusChanged(boolean gainFocus, int direction, Rect PreviouslyFocuseRect)
-
参数:
ginFocus:表示触发该事件的View是否获得了焦点,获得焦点为true,否则为false
direction:表示焦点移动方向,用数值表示
previouslyFocusedRect:表示触发事件的View的坐标系中,前一个获得焦点的矩形区域。如果不可用则为null。
-
在图形界面中,焦点描述了按键事件的承受者,每次按键事件都发生在拥有焦点的View上。
-
基于监听接口的事件处理
- 概述:引用Java中的事件监听处理机制,包括事件、事件源和事件监听器。
- 监听事件处理模型
- 事件源与事件:各个控件在不同触发情况下,产生的事件也不同
- 事件监听器:用来处理事件对象,实现特定的接口,根据事件的不同重写不同的事件处理方法来处理事件。
- 事件源与事件监听器:
otionEvent.getAction()的值为
MotionEvent.ACTION_DOWN`
**屏幕被抬起**:此时`MotionEvent.getAction()`的值为`MotionEvent.ACTION_UP`
**屏幕被拖动**:此时`MotionEvent.getAction()`的值为`MotionEvent.ACTION_MOVE`
-
onTrackballEvent()
- 轨迹球事件
-
onFocusChanged()
-
捕获焦点改变事件
-
只能再View中重写
-
protected void onFocusChanged(boolean gainFocus, int direction, Rect PreviouslyFocuseRect)
-
参数:
ginFocus:表示触发该事件的View是否获得了焦点,获得焦点为true,否则为false
direction:表示焦点移动方向,用数值表示
previouslyFocusedRect:表示触发事件的View的坐标系中,前一个获得焦点的矩形区域。如果不可用则为null。
-
在图形界面中,焦点描述了按键事件的承受者,每次按键事件都发生在拥有焦点的View上。
[外链图片转存中…(img-ufIkQwsc-1585896969004)]
-
基于监听接口的事件处理
- 概述:引用Java中的事件监听处理机制,包括事件、事件源和事件监听器。
- 监听事件处理模型
- 事件源与事件:各个控件在不同触发情况下,产生的事件也不同
- 事件监听器:用来处理事件对象,实现特定的接口,根据事件的不同重写不同的事件处理方法来处理事件。
- 事件源与事件监听器: