- 浏览: 7343935 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
页面如下:
主页面的布局分隔为三部分:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gztab_content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- header --> <include android:id="@+id/gz_top" layout="@layout/gzmgr_top_panel" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <!-- content --> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" > </TabWidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/unhanlderLayout"> <Button android:id="@+id/gzbtn_unhandler_refresh" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="刷新" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/gz_unhandler_ListView" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/handlingLayout"> <Button android:id="@+id/gzbtn_handlering_refresh" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="刷新" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/gz_handleringListView" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/handledLayout"> <Button android:id="@+id/gzbtn_handled_refresh" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="刷新" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/gzgzbtn_handled_ListView" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> <!-- bottom --> <Button android:id="@+id/btnManyInfo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="更多(10)"/> </LinearLayout>
注意观察上面标记为红色的android:id均采用android系统默认的名称:
页面的导航组件:
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:id="@+id/top_gzbtn_left" android:text="返回" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12.0dip" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> <Button android:id="@+id/top_gzbtn_right" android:text="发布" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_alignParentRight="true" android:layout_centerVertical="true" /> <TextView android:textSize="22.0sp" android:textColor="#ffffffff" android:ellipsize="middle" android:gravity="center_horizontal" android:id="@+id/top_gztxt_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="故障管理" android:singleLine="true" android:layout_toLeftOf="@+id/top_gzbtn_right" android:layout_toRightOf="@+id/top_btn_left0" android:layout_centerInParent="true" android:layout_alignWithParentIfMissing="true" > </TextView> </RelativeLayout>
上面红色布局主要采用相对布局定位相关的导航位置:
每一个tab页面的中的内容如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- 个人信息 --> <LinearLayout android:id="@+id/gzPersonInfoLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <ImageView android:id="@+id/gzimg_item_Img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px" android:layout_gravity="left" android:src="@drawable/ic_launcher"/> <TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:shrinkColumns="1" android:layout_gravity="right" > <TableRow > <TextView android:id="@+id/gztxt_item_userCode" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_UserCollectionName" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_Time" android:padding="3dip" /> </TableRow> <TableRow > <TextView android:id="@+id/gztxt_item_name_person" android:padding="3dip" /> <TextView android:text="" android:padding="3dip" /> <TextView android:padding="3dip" /> </TableRow> </TableLayout> </LinearLayout> <LinearLayout android:id="@+id/gzItemLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableRow> <TextView android:text="项目名称:" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_name" android:padding="3dip" /> <TextView android:text="列车编号:" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_code" android:padding="3dip" /> </TableRow> </TableLayout> </LinearLayout> <LinearLayout android:id="@+id/gzItemLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:shrinkColumns="1" android:layout_gravity="right" > <TableRow > <TextView android:text="故障负责人" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_user" android:padding="3dip" /> </TableRow> <TableRow > <TextView android:text="故障处理人" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_handler" android:padding="3dip" /> </TableRow> <TableRow > <TextView android:text="故障描述" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_descption" android:padding="3dip" /> </TableRow> <TableRow > <TextView android:text="问题级别:" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_level" android:text="一般" android:padding="3dip" /> </TableRow> <TableRow > <TextView android:text="状态:" android:padding="3dip" /> <TextView android:id="@+id/gztxt_item_status" android:text="未解决" android:padding="3dip" /> </TableRow> </TableLayout> </LinearLayout> </LinearLayout>
讯飞的语音sdk是需要申请的,地址是:http://dev.voicecloud.cn/developer.php?vt=1 。申请一个讯飞的开发者账号,然后申请一个appid,申请的时候需要填写开发者信息和你的应用的信息。
申请之后经过审核通过,会得到一个appid,这个是在使用语音服务时需要用到的。(笔者感觉申请还是比较容易通过的,简单地填写一下就通过了。速度也很快,我在晚上十一点多申请的,到第二天早上九点多就收到审核通过的邮件。个人感觉这个审核只是为了防止恶意使用,毕竟语音服务是要使用讯飞的服务器资源的。)
申请到appid之后就可以下载SDK了,然后使用语音服务了。
以下我试用的过程,(点击button,弹出语音框,说完之后将识别的结果显示在EditText中):
- 在eclipse里新建一个android工程
- 导入讯飞的语音jar包
-
讯飞的服务是需要一堆权限的,在manifest.xml中加入
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
分别为:通过麦克风录音、联网、获取网络信息状态、获取wifi状态、改变网络状态如是否能联网、访问电话状态 -
在main.xml中添加一个EditText和一个Button,如下
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <EditText
- android:id="@+id/editText"
- android:layout_width="fill_parent"
- android:layout_height="300dp"
- android:gravity="top"
- android:inputType="textMultiLine" >
- <requestFocus />
- </EditText>
- <Button
- android:id="@+id/button_start"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="点击开始说话" />
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/editText" android:layout_width="fill_parent" android:layout_height="300dp" android:gravity="top" android:inputType="textMultiLine" > <requestFocus /> </EditText> <Button android:id="@+id/button_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击开始说话" /> </LinearLayout>
- 然后在MainActivity中编写代码实现了
(这里可以看到在线的文档:http://dev.voicecloud.cn/developer.php?category=YW5kcm9pZA%3D%3D&column=ZG9jdW1lbnQ%3D&type=d2lkZ2V0)
通过阅读讯飞给的文档,可以发现标准的识别控件是RecognizerDialog——是一个Dialog的子类,所以我们是可以在Activity中通过showDialog(int)方法来调用它的。
重写Activity的方法
- @Override
- protected Dialog onCreateDialog(int id) {}
@Override protected Dialog onCreateDialog(int id) {}
在其中创建并设置好一个RecognizerDialog即可。
创建RecognizerDialog方法为
- RecognizerDialog recognizerDialog = new RecognizerDialog(
- MainActivity.this, "appid=1234567");// 这里应该写从科大讯飞申请到的appid
RecognizerDialog recognizerDialog = new RecognizerDialog( MainActivity.this, "appid=1234567");// 这里应该写从科大讯飞申请到的appid
(其中appid应该写自己从讯飞申请到的appid,由于协议的问题,我不便把自己申请的id公开,所以这里用了1234567来代替。根据讯飞的说明,非法的appid是不能使用语音服务的,但是我用随机数字试验了一下,居然也是能用的,不知道是不是BUG。)
官方的文档:
然后需要设置识别参数
- recognizerDialog.setEngine("sms", null, null);
recognizerDialog.setEngine("sms", null, null);
第一个参数“sms”表示为请求的服务为“语音识别”。后两个参数暂时设为null就好。
官方文档:
最后还需给recognizerDialog设置一个listener,回调接口用以获取结果,
recognizerDialog.setListener(RecognizerDialogListener listener)的参数为RecognizerDialogListener接口,实现此接口要重写两个方法:onResults(ArrayList results,boolean isLast)和onEnd(SpeechError error)。用以获取和处理结果。
我的实现为直接写了一个匿名类:
- recognizerDialog.setListener(new RecognizerDialogListener() {
- @Override
- public void onResults(ArrayList<RecognizerResult> results,
- boolean arg1) {
- StringBuffer result = new StringBuffer();
- for (RecognizerResult r : results) {
- result.append(r.text);
- }
- editText.setText(result.toString());
- }
- @Override
- public void onEnd(SpeechError arg0) {
- }
- });
recognizerDialog.setListener(new RecognizerDialogListener() { @Override public void onResults(ArrayList<RecognizerResult> results, boolean arg1) { StringBuffer result = new StringBuffer(); for (RecognizerResult r : results) { result.append(r.text); } editText.setText(result.toString()); } @Override public void onEnd(SpeechError arg0) { } });
然后将此RecognizerDialog返回即可。
完整的MainActivity代码:
- import com.iflytek.speech.RecognizerResult;
- import com.iflytek.speech.SpeechError;
- import com.iflytek.ui.RecognizerDialog;
- import com.iflytek.ui.RecognizerDialogListener;
- public class MainActivity extends Activity {
- EditText editText = null;
- Button startButton = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- editText = (EditText) findViewById(R.id.editText);
- startButton = (Button) findViewById(R.id.button_start);
- startButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- showDialog(1);
- }
- });
- }
- @Override
- protected Dialog onCreateDialog(int id) {
- RecognizerDialog recognizerDialog = new RecognizerDialog(
- MainActivity.this, "appid=1234567");// 这里应该写从科大讯飞申请到的appid
- recognizerDialog.setEngine("sms", null, null);
- recognizerDialog.setListener(new RecognizerDialogListener() {
- @Override
- public void onResults(ArrayList<RecognizerResult> results,
- boolean arg1) {
- StringBuffer result = new StringBuffer();
- for (RecognizerResult r : results) {
- result.append(r.text);
- }
- editText.setText(result.toString());
- }
- @Override
- public void onEnd(SpeechError arg0) {
- }
- });
- return recognizerDialog;
- }
- }
import com.iflytek.speech.RecognizerResult; import com.iflytek.speech.SpeechError; import com.iflytek.ui.RecognizerDialog; import com.iflytek.ui.RecognizerDialogListener; public class MainActivity extends Activity { EditText editText = null; Button startButton = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); editText = (EditText) findViewById(R.id.editText); startButton = (Button) findViewById(R.id.button_start); startButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showDialog(1); } }); } @Override protected Dialog onCreateDialog(int id) { RecognizerDialog recognizerDialog = new RecognizerDialog( MainActivity.this, "appid=1234567");// 这里应该写从科大讯飞申请到的appid recognizerDialog.setEngine("sms", null, null); recognizerDialog.setListener(new RecognizerDialogListener() { @Override public void onResults(ArrayList<RecognizerResult> results, boolean arg1) { StringBuffer result = new StringBuffer(); for (RecognizerResult r : results) { result.append(r.text); } editText.setText(result.toString()); } @Override public void onEnd(SpeechError arg0) { } }); return recognizerDialog; } }
程序在真机运行截图,经过检验,科大讯飞的识别率还是很高的。
demo下载地址:http://download.csdn.net/detail/barryhappy/4178459
发表评论
-
[转]年度最实用50款免费Android应用推荐
2012-11-08 16:39 3380据国外媒体报道,有人说Android应用市场比iPhone应用 ... -
GIS的学习(四十五)【转】Integration of the MBTiles format on Android
2012-10-22 17:13 2951转载自 http:/ ... -
GIS的学习(四十四)osmdroid sdcard检查
2012-10-15 16:12 2341在许多应用中使用到sdcard的检查,在osmdro ... -
GIS的学习(四十三)osmdroid基于几个经典代理类
2012-10-15 16:06 2633在osmdroid中给基于位置的代理类如下: pack ... -
Android中PopupWindow的用法(位置、动画、焦点)
2012-10-12 14:12 11525在Android中有很多级别的Window,不同级别的Wind ... -
【转】Android根据分辨率进行单位转换-(dp,sp转像素px)
2012-10-11 09:18 27136Android系统中,默认的单位是像素(px)。也就是说,在没 ... -
GIS的学习(二十九)Osmdroid 离线地图存放位置的研究和详细分析
2012-09-23 11:49 11563在手机通过osmdroid调用离线地图必须放在 ... -
GIS的学习(二十八)Osmdroid相关的开源项目
2012-09-23 11:31 25439osm 数据格式(openstreet map)与Ro ... -
GIS的学习(二十七)通过geoserver的georss访问第三方地图
2012-09-23 00:34 3603在geoserver中如果想调用第三方地图可以采 ... -
android中使用 定时更新界面定时器Timer的使用
2012-09-22 22:09 25526handler的使用 一、Handler的定义: ... -
【转】Android应用程序的自动更新升级(自身升级、通过tomcat) .
2012-09-16 15:03 7366http://blog.csdn.net/mu0206mu/a ... -
GIS的学习(二十七)OGC 的WCS WFS 及WMS 服务
2012-09-11 22:22 12130http://www.gisall.com/?6678/v ... -
GIS的学习(二十六)geotools 使用 部分代码总结
2012-09-11 22:20 5732前段时间的一个项目 本来用ae完成了种种的 查询,空间分析等等 ... -
GIS的学习(二十五)geoserver wms中的各种操作API详细讲解和使用
2012-09-10 17:42 9712官方geoserver中WMS服务中几种操作的API的详细说明 ... -
GIS的学习(二十四)android异步调用geoserver wms中的地图
2012-09-10 17:38 8173在geoserver的客户端通过wms的GetMap实现 ... -
GIS的学习(二十三)geoserver中CQL和ECQL的使用
2012-09-10 16:29 6641以下引用自官方文档: CQL and ECQL¶ CQ ... -
GIS的学习(二十二)osmdroid中添加縮放控件
2012-09-06 23:09 2788package com.geoserver.osmdroid; ... -
GIS的学习(二十一)在osmdroid 地图中添加marker 并添加事件
2012-09-06 22:27 6637我有 osmdroid,overlayswithf ... -
GIS的学习(二十)基于Geoserver的WFS服务与Openlayers实现地理查询
2012-08-30 18:48 11413基于Geoserver发布的wfs服务,与Openlayers ... -
GIS的学习(十九)Geoserver使用添加,删除,查询地图中的POI
2012-08-30 17:28 10359在geoserver自定义的地图中通过geoserver ...
相关推荐
滑动导航栏的实现通常基于`BottomNavigationView`组件,它是Android Support Library的一部分。开发者可以添加多个`MenuItem`,并通过设置`NavigationItemSelectedListener`监听用户的选择事件。此外,为了实现平滑...
"基于Android的广告系统设计与实现" 本文主要介绍基于Android的广告系统设计与实现,包括系统总体设计、系统功能模块、数据环境等方面的内容。 1. 系统总体设计 系统总体设计主要包括移动客户端模块、Web模块、...
8. **页面滑动布局(ViewPager)**:在图片浏览和电子阅读应用中非常常见,允许用户左右滑动查看多个页面,适合实现电子书翻页效果。 9. **网格视图(GridView)**:与网格布局类似,但提供滚动功能,适用于图片库...
DrawerLayout是一个可以侧向滑出和隐藏的布局,常用于实现类似iOS的抽屉式导航菜单。以下是实现侧滑菜单的基本流程: 1. **添加DrawerLayout**:在主布局XML文件中,将DrawerLayout作为根元素,并设置相应的属性,...
《基于Android平台的手机应用软件设计与实现设计说明》 在当今信息科技高速发展的时代,移动设备已经成为我们生活和工作中不可或缺的一部分。Android平台以其开放性和灵活性,成为了全球智能手机市场的主导力量,...
在Android应用开发中,"基于GridView和ActivityGroup实现的TAB分页"是一个常见的设计模式,用于构建具有多个页面(Tab)且每个页面展示不同数据集的应用界面。这种设计能够提高用户体验,让用户通过简单的点击切换就...
在Android应用开发中,Tabbar通常作为底部导航栏,用于展示多个主要功能模块,让用户能够快速切换不同页面。本文将详细介绍如何使用`TabActivity`来实现Android应用中的底部Tabbar功能。 首先,`TabActivity`是...
"实现新浪微博消息页面左右滑动页面"这个任务主要涉及的是实现一种常见的移动端UI交互设计,即侧滑导航或者叫做抽屉式导航。这种设计通常用于展示更多的菜单选项或者在不同的内容之间进行切换,如在微博的消息、发现...
以上就是关于“滑动导航栏+滚动页面”在Android应用中的实现涉及到的主要技术点。理解并掌握这些知识点,将有助于你构建更加专业和用户友好的Android应用。通过实践和不断的迭代,你可以创造出更加流畅、功能丰富的...
总的来说,`ScrollableLayout-master`项目提供了实现仿美团、仿微博评论功能的实例,它涉及到Android UI设计的核心技术,包括自定义布局、嵌套滚动、吸顶效果以及视图间的交互。对于想要提升Android UI开发技能的...
总的来说,`SwipeBackLayout`为Android应用带来了更自然的导航体验,而实现这一功能需要对Android手势识别、布局管理以及动画系统有深入的理解。通过以上步骤和技巧,开发者可以创建出符合用户习惯的滑动返回交互,...
其中,ConstraintLayout是现代Android开发中的首选布局,因为它允许开发者更灵活地定位和约束视图,减少了嵌套布局导致的性能问题。 二、UI控件 1. Button:按钮是最基本的交互元素,可以用于触发操作。 2. ...
subNvue是uni-app中用于子页面导航的一种特殊布局方式,它主要用于处理嵌套在nVue页面中的子页面。在商城应用中,通常会使用subNvue来构建商品详情页、购物车、订单管理等复杂功能的子页面。 - **独立导航**:...
- **NestedScrollView**:支持嵌套滚动,可以与ViewPager结合实现复杂滑动效果。 - **TabLayout+ViewPager**:创建带有标签页的滑动页面,提供良好的导航体验。 3. **手势识别**: - **GestureDetector**:处理...
在创建“关于我们”页面时,通常我们需要考虑页面的布局、样式设计以及JavaScript功能实现。在这个模板中,布局可能已经预设了结构,比如头部、内容区和底部导航,这些可以通过Vue的组件化思想进行拆分和复用。布局...
Android UI设计主要基于XML布局文件,通过定义控件(如TextView、ImageView、Button等)的位置、大小和样式,来构建应用界面。此外,还要掌握主题(Theme)和样式(Style)的应用,以实现全局统一的视觉效果。 二、...
- **嵌套使用**: 可以将不同类型的布局嵌套在一起,构建更为复杂的界面结构。 #### 四、常用UI部件 **4.1 基础组件** - **TextView**: 显示文本。 - **EditText**: 输入文本。 - **Button**: 触发动作。 - **...
Android提供了一种基于密度和屏幕尺寸的资源目录结构,如`res/layout`、`res/layout-sw600dp`等,使得开发者可以针对不同设备提供定制化的布局。在`res/layout`目录下,你可以创建基本的布局文件,而在`res/layout-...
这个压缩包文件“Android本科毕业设计阅读小说app系统源码.zip”显然包含了开发一个基于Android平台的阅读小说应用的所有源代码。以下是对其中关键文件及其对应知识点的详细解释: 1. **main.js**: 这是JavaScript...
【标题】"安卓悬浮吸顶效果.zip" 描述的是一个在Android平台上实现的特定交互设计,通常用于音乐播放器、新闻阅读应用等,当用户滚动页面时,顶部的某些元素如歌名、歌手信息会固定在屏幕顶端,即使用户继续下拉浏览...