android:id="@+id/icon"android:layout_width="wrap_content"android:layout_height="fil" />
Android ListView专题之一多层树完美实现
.xml:
代码
android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:layout_alignParentTop="true" android:layout_marginRight="6.0dip"/> android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:layout_alignParentTop="true" android:layout_toRightOf="@id/icon" android:gravity="center_vertical" android:singleLine="true" android:textAppearance="?android:textAppearanceMedium" android:textColor="#ffffff"/>
TreeElement.java:
private String id;
private String outlineTitle;
privateboolean mhasParent;
privateboolean mhasChild;
private TreeElement parent;
privateint level;
private ArrayList
public String getId() {
return id;
}
publicvoid setId(String id) {
this.id = id;
}
public String getOutlineTitle() {
return outlineTitle;
}
publicvoid setOutlineTitle(String outlineTitle) {
this.outlineTitle = outlineTitle;
}
publicboolean isMhasParent() {
return mhasParent;
}
publicvoid setMhasParent(boolean mhasParent) { this.mhasParent = mhasParent;
}
publicboolean isMhasChild() {
return mhasChild;
}
publicvoid setMhasChild(boolean mhasChild) { this.mhasChild = mhasChild;
}
publicint getLevel() {
return level;
}
publicvoid setLevel(int level) {
this.level = level;
}
publicboolean isExpanded() {
return expanded;
}
publicvoid setExpanded(boolean expanded) { this.expanded = expanded;
}
public TreeElement getParent() {
return parent;
}
publicvoid setParent(TreeElement parent) { this.parent = parent;
}
// private OutlineElement outlineElement; privateboolean expanded;
c.parent = this;
c.level = this.level + 1;
}
public TreeElement(String id, String title) {
super();
this.id = id;
this.outlineTitle = title;
this.level = 0;
this.mhasParent = true;
this.mhasChild = false;
this.parent = null;
}
public TreeElement(String id, String outlineTitle, boolean mhasParent,
boolean mhasChild, TreeElement parent, int level, boolean expanded) { super();
this.id = id;
this.outlineTitle = outlineTitle;
this.mhasParent = mhasParent;
this.mhasChild = mhasChild;
this.parent = parent;
if (parent != null) {
this.parent.getChildList().add(this);
}
this.level = level;
this.expanded = expanded;
}
}
TreeView.java:
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initialData();
treeViewAdapter = new TreeViewAdapter(this, https://www.doczj.com/doc/8613520488.html,yout.main,
mPdfOutlinesCount);
setListAdapter(treeViewAdapter);
registerForContextMenu(getListView());
}
mPdfOutlinesCount.add(element1);
mPdfOutlinesCount.add(element2);
mPdfOutlinesCount.add(element9);
element2.addChild(element3);
element1.addChild(element4);
element1.addChild(element5);
element1.addChild(element6);
element1.addChild(element7);
element7.addChild(element8);
element9.addChild(element10);
element9.addChild(element11);
element11.addChild(element12);
element11.addChild(element13);
element10.addChild(element14);
element10.addChild(element15);
element10.addChild(element16);
element10.addChild(element17);
element10.addChild(element18);
element10.addChild(element19); }
publicint getCount() {
return mfilelist.size();
}
public Object getItem(int position) {
return position;
}
publiclong getItemId(int position) {
return position;
}
@Override
publicvoid onClick(View v) {
Log.i("TreeView", "obj.id:" + obj.getId());
}
});
holder.icon.getPaddingTop(), 0,
holder.icon.getPaddingBottom());
holder.text.setText(obj.getOutlineTitle());
if (obj.isMhasChild() && (obj.isExpanded() == false)) {
holder.icon.setImageBitmap(mIconCollapse);
} elseif (obj.isMhasChild() && (obj.isExpanded() == true)) {
holder.icon.setImageBitmap(mIconExpand);
} elseif (!obj.isMhasChild()) {
holder.icon.setImageBitmap(mIconCollapse);
holder.icon.setVisibility(View.INVISIBLE);
}
return convertView;
}
class ViewHolder {
TextView text;
ImageView icon;
}
}
@Override
protectedvoid onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id);
Log.i("TreeView", "position:" + position);
if (!mPdfOutlinesCount.get(position).isMhasChild()) {
Toast.makeText(this, mPdfOutlinesCount.get(position)
.getOutlineTitle(), 2000);
return;
}
if (mPdfOutlinesCount.get(position).isExpanded()) {
mPdfOutlinesCount.get(position).setExpanded(false);
TreeElement element = mPdfOutlinesCount.get(position);
ArrayList
for (int i = position + 1; i if (element.getLevel() >= mPdfOutlinesCount.get(i).getLevel()) { break; } temp.add(mPdfOutlinesCount.get(i)); } mPdfOutlinesCount.removeAll(temp); treeViewAdapter.notifyDataSetChanged(); } else { TreeElement obj = mPdfOutlinesCount.get(position); obj.setExpanded(true); int level = obj.getLevel(); int nextLevel = level + 1; for (TreeElement element : obj.getChildList()) { element.setLevel(nextLevel); element.setExpanded(false); mPdfOutlinesCount.add(position + 1, element); } treeViewAdapter.notifyDataSetChanged(); // setListAdapter(fileExploreAdapter); } } } 在res/xml文件夹下面新建attrs.xml Java代码 name="title" format="string"/> name="titleTextSize" format="dimension"/> name="titleTextColor" format="color"/> name="leftTextColor" format="color"/> name="leftBackground" format="string"/> name="leftText" format="string"/> name="rightTextColor" format="color"/> name="rightBackground" format="string"/> name="rightText" format="string"/> 布局文件: Java代码 xmlns:custom="https://www.doczj.com/doc/8613520488.html,/apk/res/com.android.custom" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ff00ff00"/> android:id="@+id/topBar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#0000ff" custom:leftBackground="@drawable/icon" custom:leftText="左侧" custom:leftTextColor="#123123" custom:rightBackground="@drawable/icon" custom:rightText="右侧" custom:rightTextColor="#ff0000" custom:title="自定义标题" custom:titleTextColor="#ff0000" custom:titleTextSize="14.0sp"> Android ListView专题之二滚动卡的问题 写了个类似下面的GridView,滚动的时候有卡或者跳格的现象,尤其当记录比较多的时候。 ListView替换GridView,问题依旧。 实现的示例大致是这个样子: 测试数据有600条左右。不过,即使减到40条左右,也是会卡的。在ddms log中监控dalvik日志,会有大量下面的信 息: 01-14 10:37:47.579: DEBUG/dalvikvm(13626): GC_EXTERNAL_ALLOC freed 58 objects / 2072 bytes in 37ms 基本上每滚动一次,就会出10多条。这是造成卡的主要原因。也就是说,要释放大量的临时对象。这些临时对象还不是我自己创建的对象,我把结果集合已经一次性加载到内存中了。也不是图片显示造成的,我把图片去掉现象一样。 另外,也考虑了比如扩大堆内存的方法,但是不对症下药,因为并不是内存达到堆的上限造成full gc。有关堆的日志可以过滤dalvikvm-heap看到。如果堆内存full gc会有类似这样的日志: dalvikvm-heap(11651): Heap Massage needed (768000-byte external allocation too big) dalvikvm-heap(11651): Full GC (don’t collect SoftRe ferences) 可以初步判断,是GridView/ListView为实现滚屏产生的瞬态使用对象,随着滚动而被快速丢弃了,需要垃圾回收,造成性能问题。 可是,为什么Android自带的通讯录却不卡呢?我的手机上的通讯录也有将近300条的记录。通过ddms日志观察,没有频繁的GC_EXTERNAL_ALLOC日志,从头滚动到尾只出现了1-2次。 于是决定查看通讯录的源代码。这几行: @Override public View getView(int position, View convertView, ViewGroup parent) { …… View v; if (convertView == null || convertView.getTag() == null) { newView = true; v = new View(mContext, cursor, parent); } else { newView = false; v = convertView; } 说明了对ListView元素视图的复用。再查api: convertView The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. 因此,可以认为,convertView是元素的缓存,因为元素本身没有变化,因此可以判断如果非空,就可以复用。比如我示例中是这样写的: if (convertView == null) { convertView=activity.getLayoutInflater().inflate( https://www.doczj.com/doc/8613520488.html,yout.album_grid_element, parent, false); 之前是每次直接创建新的view的,没有考虑复用convertView。这是造成卡的根本原因。 这次的另外的一个教训是,解决问题没有从api层面层层深入解决问题,即这样的次序:api是否能解决?是否需要通过自己的优化解决?是否需要系统的部署方面的配置比如堆的调整来解决等。 结果是走了弯路,消耗了时间。 以后还是要先通读api文档。这次出问题,是建立在以前随手写的简单示例基础上的。 Android ListView专题之三快速滚动示例增加首字母提示 (2011-11-04 11:56:13) 在自定义ListView FastScroller滑块图片中实现了快速滚动。在原有示例基础上增加了这样的功能: 本文和上面示例借鉴了:https://www.doczj.com/doc/8613520488.html,/sodino/archive/2010/12/15/6077017.aspx做的比较简单。需要为ListView注册一个滚动监听器: listView.setOnScrollListener(new OnScrollListener() { boolean visible; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { visible = true; if (scrollState == ListView.OnScrollListener.SCROLL_STA TE_IDLE) { overlay.setVisibility(View.INVISIBLE); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (visible) { overlay.setText(items[firstVisibleItem].substring(0, 1)); overlay.setVisibility(View.VISIBLE); } } }); 当然,还需要提示信息的布局文件: android:background="#99000088" android:gravity="center" android:maxWidth="80dp" android:minWidth="80dp" android:padding="10dp" android:textColor="#ffffffff" android:textSize="70sp" android:visibility="invisible"/> 理论上,可以做出很花哨的提示界面。 在Activity的onCreate方法中加入这个界面: this.overlay = (TextView) View.inflate(this, https://www.doczj.com/doc/8613520488.html,yout.overlay, null); getWindowManager() .addView( overlay, new https://www.doczj.com/doc/8613520488.html,youtParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, https://www.doczj.com/doc/8613520488.html,youtParams.TYPE_APPLICATION, https://www.doczj.com/doc/8613520488.html,youtParams.FLAG_NOT_FOCUSABLE | https://www.doczj.com/doc/8613520488.html,youtParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT)); 这里要注意: listView.setOnScrollListener(new OnScrollListener() { boolean visible; 监听器代码中增加了一个visible标志位。用于判断是否滚动状态变化过。否则,启动Activity后,无论提示界面是否invisible,都会显示,因为会调用onScroll方法。 源代码见: https://www.doczj.com/doc/8613520488.html,/svn/tags/ListViewCustomerFastScroller-0.2/ Android ListView专题之四自定义对话框以及列表形式的切换 从界面变化来看,主要是增加了自定义对话框,以及列表形式的切换。看截图: 长按后还是显示checkbox。点击view按钮,将出现对话框: 如果touch对话框以外的区域,对话框将消失,这就比较类似ios里的popover了。 view mode下的radio按钮,可以切换列表形式,比如从缩略图(默认的模式)转换到列表模式下。 说一下如何实现自定义对话框。大致步骤有: 编写类,继承Dialog 覆盖超类的onTouchEvent方法。基本思路是在该方法中,判断一下touch的坐标是在对话框包含的视图坐标里还是外,如果是外,就hide(或者也可dismess)对话框对象。 代码如下: class MyDialog extends Dialog { public MyDialog(Context context) { super(context); } public MyDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { super(context, cancelable, cancelListener); } public MyDialog(Context context, int theme) { super(context, theme); } @Override public boolean onT ouchEvent(MotionEvent event) { Rect rect = new Rect(); View view = findViewById(R.id.dialogLayout);// 取对话框最外层视图 view.getWindowVisibleDisplayFrame(rect);// 得到window的矩形 // 因为对话框居中,因此对话框相对于window的坐标可通过对话框长和宽以及window矩形计算出来 Rect rect2 = new Rect((rect.right – view.getRight()) / 2, + (rect.right – view.getRight()) / 2, view.getBottom() + (rect.bottom – view.getBottom())); if (!rect2.contains((int) event.getRawX(), (int) event.getRawY())) { this.dismiss(); return true; } return super.onTouchEvent(event); } } 切换表的表现形式,说起来很简单,其实就是为ListView设置不同的adapter即可。即:ListView.setAdapter()方法。每次设置不同的adapter实例,就会即可改变列表的表现形式。 在本例中,因为有数据的变化等因素,代码比在原有ListView示例上做的改进要复杂很多。 另外,本例使用sqlite数据库替代了大部分原来用数组和列表模拟的数据集合。见com.easymorse.list.datasource包下的三个类,是一个标准的dao实现。dao的代码,主要实现了crud。代码: public class RecordDao { @SuppressWarnings("unused") private static final String TAG = "listview"; // 由于模拟图片数据 private static final int[] drawables = { R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4, R.drawable.a5, R.drawable.a6, R.drawable.a7, R.drawable.a8, R.drawable.a9, R.drawable.a10, R.drawable.a12, R.drawable.a13 }; // 图片的缓存,使用SoftReference是为了防止oom private static Map private Context context; private SQLiteDatabase database; public RecordDao(Context context) { this.context = context; init(); } public Drawable getDrawable(Long id) { // 如果缓存中有,使用缓存的 if (drawableCache.get(id) != null && drawableCache.get(id).get() != null) { return drawableCache.get(id).get(); } // 未在缓存中,可能是没加入缓存,也可能是垃圾回收,则重新获取,并加载缓存中 if (id >= 1 && id <= drawables.length) { Drawable drawable = context.getResources().getDrawable( drawables[id.intValue() - 1]); drawableCache.put(id, new SoftReference return drawable; return null; } private void init() { this.database = context.openOrCreateDatabase("mydata", Context.MODE_PRIVATE, null); //TODO 正式使用时,取消下面初始化代码,改为使用SQLiteOpenHelper dropTables(); createTables(); for (int i = 0; i < 12; i++) { create(new Record(null, "柴可夫司机")); } } public void create(Record record) { SQLiteStatement statement = database .compileStatement("insert into mydata (name) values(?)"); statement.bindString(1, record.getName()); statement.execute(); statement.close(); //需要设置record的id,否则没有唯一标识,无法和数据库交互 Cursor cursor = database.rawQuery( "select last_insert_rowid() from mydata", new String[] {}); if (cursor.moveT oFirst()) { record.setId(cursor.getLong(0)); } cursor.close(); } public void browse(Page page) { page.setResults(new ArrayList Cursor cursor = database.rawQuery("select count(*) from mydata ", new String[] {}); if (cursor.moveT oFirst()) { page.setCount(cursor.getInt(0)); } cursor.close(); if (page.getCount() > page.getSize() * (page.getNo() – 1)) { cursor = database.rawQuery( "select id,name from mydata limit " + page.getSize() * (page.getNo() – 1) + " , " + page.getSize(), new String[] {});//使用limit子句 while (cursor.moveToNext()) { Record record = new Record(cursor.getLong(0), cursor.getString(1)); page.getResults().add(record); } cursor.close(); } public void delete(Long id) { SQLiteStatement statement = database .compileStatement("delete from mydata where id=?"); statement.bindLong(1, id); statement.execute(); statement.close(); } public Record get(Long id) { Record record = null; Cursor cursor = database.rawQuery("select name from mydata where id=" + id, new String[] {}); if (cursor.moveT oFirst()) { record = new Record(); record.setName(cursor.getString(0)); record.setId(id); } cursor.close(); return record; } private void dropTables() { database.execSQL("drop table if exists mydata"); } private void createTables() { database.execSQL("create table if not exists mydata(" + " id integer primary key autoincrement," + " name text" + ")"); } } 另外,这里做了个简单的缓存Drawable对象,使用SoftReference,软引用,这样当虚拟机内存够用的时候保持在内存中。当内存不足才清除。 源代码见: https://www.doczj.com/doc/8613520488.html,/svn/tags/ListViewDemo-0.8/ 续: 对话框的使用小结 曾经在ListView自定义对话框以及列表形式的切换中写过处理对话框退出的方式,touch对话框以外的区域退出对话框。刚才查Dialog javadoc的时候,发现其实可以这样: dialog.setCanceledOnTouchOutside(true); 效果是一样的。而且,应该更好。因为我自定义的实现,只能在对话框居中的时候才有效。官方的方法应该可以处理对话框偏移的情况,不过我没有时间测试了。如果想做出不带标题栏的对话框,比如这样的对话框: 只需: dialog.requestWindowFeature(Window.FEA TURE_NO_TITLE); Android ListView专题之五实现类似Gallery的功能利用ListView,实现类似Android Gallery的功能。效果类似这样: 长按列表中元素: 勾选列表中元素,点击“选择”按钮: 点击删除按钮,则删掉所选元素: 再次长按屏幕中元素,按钮和多选框消失。另外,按系统回退按钮也可使按钮和多选框消失。如果没有多选框和按钮的时候,回退按钮将执行系统操作,退出应用。 实现这部分代码有几个难点: 长按界面中元素,所有元素都显示CheckBox,当然可以遍历所有元素(视图)并设置相应的CheckBox为visible,这样逻辑会比较乱,本例中使用了java提供的对观察者模式的支持类 删除其中某几个元素,应该保持在当前位置,其他相邻元素填补删除的空缺 下面说说难点的实现方法。先说观察者模式。实际上是引入了第三个对象,可观察对象,你可以把它看作中间人,所有元素都在这个中间人对象上注册了监听器,当其中一个被长按后,通知所有元素设置checkbox。 可以通过: https://www.doczj.com/doc/8613520488.html,/Code/Java/Design-Pattern/AsimpledemoofObservableandObserver.htm 中的示例了解观察者模式以及java Observer的使用方法。 在本例中,通过内部类实现了Observable接口: class MyObservable extends Observable { public void toobarStatusChanged(boolean visible) { setChanged(); notifyObservers(visible); } } 这里实现了Observer的继承类,并为每个元素创建示例注册到Observable中: // 创建观察者,用于监控是否有Checkbox可见性事件,然后加入到可观察对象中 Observer observer = new Observer() { @Override public void update(Observable observable, Object data) { checkBox.setVisibility((Boolean) data ? View.VISIBLE : View.INVISIBLE); checkBox.setChecked(checkedIds.contains(index)); }; observable.addObserver(observer); 另外,实现了一个Observer实例用于监控长按事件的变化,来生成或者取消工具条按钮。 这个实现目前可以工作,但是可能还有问题,造成大量的Observer对象的存在,因为每次创建ListView的Row都会重新创建,等有时间再解决。 如何做到删除其中几个元素,后面相邻元素自动补位,而且屏幕保持在当前位置。我的做法基本思路是,取到当前屏幕显示的各行,在Nexusone的分辨率下可取到3行,然后获取各行的ViewGroup对象,清空它的子视图,然后再根据数据源(本文是一个List)重新填充行的内容。 如何得到当前在屏幕的行的ViewGroup呢?其实并不复杂: myListView.getChildCount() 可得到屏幕上能看到几行。 再通过遍历: myListView.getChildAt(i) 就可以得到各行的ViewGroup。ListView的实现原理是,只保存当前可见的几行视图。并保存在ViewGroup的childView 数组中,上述的两个方法getChildCount和getChildAt实际上是ViewGroup的,ListView并未覆盖。 完整的代码类似这样: for (int i = 0; i < myListView.getChildCount(); i++) { ViewGroup viewgroup = (ViewGroup) myListView.getChildAt(i); viewgroup.removeAllViews(); generateRowElements( myListView.getPositionForView(viewgroup), viewgroup); } 完整源代码包含了详细的注释: package com.easymorse.list; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Observable; import java.util.Observer; import java.util.Set; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnKeyListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import https://www.doczj.com/doc/8613520488.html,poundButton; import https://www.doczj.com/doc/8613520488.html,poundButton.OnCheckedChangeListener; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class ListViewDemoActivity extends Activity { class MyObservable extends Observable { public void toobarStatusChanged(boolean visible) { setChanged(); notifyObservers(visible); } } // 每行显示几个图片 private static final int ROW_ELEMENTS_SIZE = 5; // 本例中的ListView private ListView myListView; // checkbox是否可见的标志位 private boolean checkItemVisible; private ViewGroup toolbar; // 存放选中的checkbox条目的图片列表下标 private Set private MyObservable observable = new MyObservable(); // 演示用的图片数据集合 @SuppressWarnings("serial") private List add(R.drawable.defense_mechanism); add(R.drawable.gzorah); add(R.drawable.jay_z_linkin_park); add(R.drawable.korn); add(R.drawable.defense_mechanism); add(R.drawable.gzorah); add(R.drawable.jay_z_linkin_park); add(R.drawable.korn); add(R.drawable.defense_mechanism); add(R.drawable.gzorah); add(R.drawable.jay_z_linkin_park); add(R.drawable.korn); add(R.drawable.defense_mechanism); add(R.drawable.gzorah); add(R.drawable.jay_z_linkin_park); add(R.drawable.korn); add(R.drawable.defense_mechanism); add(R.drawable.gzorah); 通信实训报告 -Android移动平台开发 学院:信息工程学院 班级: 学号: 姓名: 实训内容: 一.1.Andriod的简介 Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前,最新版本为Android 2.4 Gingerbread 和Android 3.0 Honeycomb。 Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 Android早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张,在智能MP4方面也有较大发展。采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:魅族(M9),华为、中兴、联想、蓝魔等。 2.Android构架图 二.1软件下载 Android SDK,网址是https://www.doczj.com/doc/8613520488.html,. JDK的下载地址https://www.doczj.com/doc/8613520488.html,/javase/downloads/widget/jdk6.jsp。Eclipse的下载网址是https://www.doczj.com/doc/8613520488.html,/downloads/ 2.Android开发环境搭建 视图组件的使用模式 常用组件 高级组件 提示框与警告对话框 就是Android应用程序的开发过程。一般过程是先通过XML布局文件或Java代码创建界面布局,设定组件显示样式,随后获取UI组件对象,并处理组件事件响应。 视图组件的定义 资源的访问 生成视图组件资源标识 视图组件的引用 视图组件的事件响应 组件的常用属性 1.1视图组件的定义 使用XML布局文件定义视图组件 使用Java代码定义视图组件(不推荐) 1.1视图组件的定义 使用XML布局文件定义视图组件 Android平台为大多数视图组件以及其子类提供了XML标记,可通过XML布局文件中的标记来定义视图组件。XML中的每个元素代表了一个组件,即元素名称对应相应的Java类。 1.1视图组件的定义 这样的话就比较容易实现了,再看一下整体的Layout布局情况: xml布局文件如下:注意层次的嵌套。先是一个RelativeLayout,它有两个子布局,RelativeLayout和LinearLayout。 android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:padding="10.0dip" android:singleLine="true" android:text="设置" android:textColor="@color/white" android:textSize="15dp" /> 基于Android系统的App界面设计 智能手机时代的来临改变了大多数人的生活习惯,时至今日智能手机已经成为了人们工作生活中的一部分,在工作生活中发挥着重要的作用。App作为智能手机应用程序的核心,构建以用户体验为核心的页面设计是智能手机App设计的核心与要点,同时也是满足用户使用需求的重要途径与方式。现今的智能手机App主要分为IOS与Android两大市场,与IOS的封闭不同的是Android系统具有极强的开放性,而这一开放性在为Android系统App带来无限可能的同时也使得基于Android系统所开发的App界面本身缺乏统一的规范,从而造成基于Android系统所开发的App界面具有极大的开放性。新时期为做好基于Android 系统App的设计需要从情感、认知以及感官三个层面入手做好基于Android系统的App界面的开发设计,使之具有良好的用户使用体验。 标签:Android系统;App;界面设计 Abstract:The advent of the smart phone era has changed the habits of most people. Today,smart phone s have become a part of people’s work and life,and play an important role in the work and life. As the core of smart phone applications,App plays an important role in the work and life. The design of page based on user experience is the core and key point of the App design of smart phone,and it is also an important way and way to meet the needs of users. Today’s smartphone App is mainly divided into IOS and Android two major markets,Different from the closure of IOS,Android system has a very strong openness,and this openness not only brings infinite possibility to App of Android system,but also makes the App interface based on Android system lack of unified specification. As a result,the App interface based on Android system is very open. In order to do well the design of App based on Android system in the new period,it is necessary to develop and design the App interface based on Android system from the three aspects of emotion,cognition and sense organ,to make it have a good user experience. Keywords:Android system;App;interface design 前言 Android系统是与IOS系统所并行的应用于智能手机中的两大智能系统,在基于Android系统App界面开发的过程中受多种因素的影响使得一些App的界面具有很大的不协调性,从而影响了广大用户的使用体验。本文在分析影响智能手机App界面设计因素的基础上对如何做好基于Android系统的App界面设计进行分析阐述。 1 影响智能手机App界面设计的因素分析 智能手机App是智能手机的灵魂,用户结合自身需求可以下载安装自身所 UI设计9要素: Do: ◆为高分辨率的屏幕创建资源(缩小总比放大好) ◆需要点击的元素要够大 ◆图标设计遵循 Android 的准则 ◆使用适当的间距(margins, padding) ◆支持D-pad和trackball导航 ◆正确管理活动(activity)堆栈 ◆正确处理屏幕方向变化 ◆使用主题/样式,尺寸和颜色资源来减少多余的值 ◆和视觉交互设计师合作! UI设计5不要 Don’t: ◆不要照搬你在其它平台的UI设计,应该让用户感觉是在真正使用一个 Android 软件,在你的商标显示和平台整体观感之间做好平衡 ◆不要过度使用模态对话框 ◆不要使用固定的绝对定位的布局 ◆不要使用px单位,使用dp或者为文本使用sp ◆不要使用太小的字体 4则Android UI的设计哲学: ◆干净而不过于简单 ◆关注内容而非修饰 ◆保存一致,让用户容易投入其中,可附加少许变化 ◆使用云端服务(存储和同步用户资料)来加强用户体验 优秀界面的设计5条准则: ◆关注用户 ◆显示正确的内容 ◆给予用户适当的回馈 ◆有章可循的行为模式 ◆容忍错误 设计需要考量的8地方: ◆屏幕的物理尺寸 ◆屏幕密度 ◆屏幕的方向(竖向和横向) ◆主要的UI交互方式(触屏还是使用D-pad/trackball) ◆软键盘还是物理键盘 ◆了解不同设备之间的相异之处是非常重要的! ◆阅读CDD,学习设备可能差异的地方 ◆了解屏幕尺寸和密度分类 TextView重要属性: RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft 贴紧父元素的左边缘 android:layout_alignParentRight 贴紧父元素的右边缘 android:layout_alignParentTop 贴紧父元素的上边缘 android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物 第二类:属性值必须为id的引用名“@id/id-name” android:layout_below在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右边 android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐 android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐 android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐 android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐 第三类:属性值为具体的像素值,如30dip,40px android:layout_marginBottom 离某元素底边缘的距离 Android UI开发专题(一) 之界面设计 发帖日期:2010-02-09 10:49:28 标签:ophone 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id) 对应res/values/colors.xml Drawable getDrawable(int id) 对应res/drawable/ XmlResourceParser getLayout(int id) 对应res/layout/ String getString(int id) 和CharSequence getText(int id) 对应 res/values/strings.xml InputStream openRawResource(int id) 对应res/raw/ void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/ String[] getStringArray(int id) res/values/arrays.xml float getDimension(int id) res/values/dimens.xml 二、android.graphics.Bitmap 作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下: boolean compress(https://www.doczj.com/doc/8613520488.html,pressFormat format, int quality, OutputStream stream) 压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。其中第一个压缩格式目前有JPG和PNG void copyPixelsFromBuffer(Buffer src) 从一个Buffer缓冲区复制位图像素 移动互联网开发 课程设计报告 学生姓名:余安慧学号:031440407 专业:计算机科学与技术班级:0314404 设计题目:茶百科 学年学期:2016 年秋季学期 指导教师:张华 目录 一、设计题目 (1) 二、设计目的 (1) 三、设计原理及方案 (1) 1使用的软件工具和环境 (1) 2需求分析与概要设计 (2) 3数据库设计 (3) 4详细设计和关键问题 (5) 四、实现效果 (13) 五、设计体会 (16) 参考文献 (17) 一、设计题目 茶百科 二、设计目的 随着智能手机一步步走进普通人的生活,它将成为人们获取信息的主要设备。因此,手机的应用服务将会有很大的发展空间,手机茶百科软件就是其中的一项。Android平台提供给用户非常方便的茶百科查询功能,这将为茶百科查询服务的设计与实现提供了更好的平台。另外,Android平台基本上是免费的,所以能够有效降低软件的成本,最终让每个用户能够自由地获取信息,也为手机茶百科查询服务的普及做出贡献。 本文对目前应用的Symbian、WindowsMobile、MacOSX和RIM等平台的现状进行了分析与比较。进而研究分析了Android平台的系统架构和组件模型,接着解析了Android中的重要API 和应用构成。主要应用了数据库,碎片,图片缓存等技术,在此基础上,基于Android平台设计和开发手机茶百科查询软件。本系统界面友好、操作便捷,具有良好的可扩展性和可维护性;系统经过测试,可以稳定运行,能够满足手机用户的基本需求。 通过设计开发茶百科安卓客户端,综合训练安卓系统开发能力,进一步提升对安卓程序开发及运行的理解和认识,复习、巩固java语言的基础知识,进一步加深对java语言的理解和掌握,搭建一个完整的安卓开发环境。为学生提供了一个既动手又动脑,独立实践的机会,开发出界面与功能都有特色的安卓应用软件。 三、设计原理及方案 1使用的软件工具和环境 (1)PC计算机 (2)JDK安装包:JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上 的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库 (3)Eclipse安装包:是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言, 它只是一个框架和一组服务,用于通过插件组件构建开发环境 (4)Android SDK安装包:Android SDK 指的是Android专属的软件开发工具包 (5)ADT插件:使用Eclipse进行android应用开发需要给Eclipse装ADT件,这样Eclipse 就可以和android sdk建立连接 https://www.doczj.com/doc/8613520488.html,/cmdn/bbs/viewthread.php?tid=18736&page=1 #pid89255 Android UI开发专题(一) 之界面设计 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容:android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id) 对应res/values/colors.xml Drawable getDrawable(int id) 对应res/drawable/ XmlResourceParser getLayout(int id) 对应res/layout/ String getString(int id) 和CharSequence getText(int id) 对应res/values/strings.xml InputStream openRawResource(int id) 对应res/raw/ void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/ String[] getStringArray(int id) res/values/arrays.xml float getDimension(int id) res/values/dimens.xml 二、android.graphics.Bitmap 作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下: boolean compress(https://www.doczj.com/doc/8613520488.html,pressFormat format, int quality, OutputStream stream) 压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。其中第一个压缩格式目前有JPG和PNG void copyPixelsFromBuffer(Buffer src) 从一个Buffer缓冲区复制位图像素 void copyPixelsToBuffer(Buffer dst) 将当前位图像素内容复制到一个Buffer缓冲区 我们看到创建位图对象createBitmap包含了6种方法在目前的Android 2.1 SDK中,当然他们使用的是API Level均为1,所以说从Android 1.0 SDK开始就支持了,所以大家可以放心使用。 实验2 android的界面设计(控件与布局) 学时:4学时 一、实验目的: 1、了解Android编程原理 2、掌握界面控件设计 3、了解和熟悉常用控件的使用、界面布局等内容。 二、实验内容: 1.基本控件的制作: (1)TextView的制作: a)体会Autolink,依次更换属性:web/phone/all/email/ b) 制作跑马灯效果 android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置:”start”—-省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee”——以跑马灯的方式显示(动画横向移动) android:marqueeRepeatLimit 在ellipsize 指定marquee 的情况下,设置重复滚动的次数,当设置为marquee_forever 时表示无限次。 android:focusableInTouchMode:是否在触摸模式下获得焦点。 android:focusable 控件是否能够获取焦点 (2)EditView制作 (a) maxLength:最大输入长度属性 (b) singleLine:多行文本框 (c) inputType:限制输入文本类型 (d) hint:设置提示信息 2.布局设计 (1) LinearLayout布局: (2)Relative Layout: (3)Table Layout 3.建立一个如图所示的图形界面: 4.用ListView制作如图界面(图片自定) (将该题以你的学号命名,发给你班的学习委员,以班为单位统一发给我,我的邮箱为:610083060@https://www.doczj.com/doc/8613520488.html,): 5.用expandablelistview制作如下界面: Android 人机界面设计规范 1Android 设计的依据 1.1 框架结构及流程 是什么使得android 有着独特的用户体验? 后台处理支持多任务功能 正在进行和事件驱动的提示信息 通过Widgets 和live folders 来实现实时信息的预览 用户想用时,任一应用程序都可以挑选和选择 android 不是关于程序的,它是关于活动,把任务分层, 1.2 架构基础 硬件平台 android 设备代表的是硬件和软件的完美组合。硬件辅助导航操作,并给android 提供更多更好的功能。当菜单没有开启,要把屏幕最大化时,菜单按钮可以在屏幕上提供更多的内容。返回按钮允许使用返回堆(back stack)。 竖屏与横屏 一般来说,用户界面开发竖屏与横屏。在新横屏也仍存在于新的Android 手机中。99%的android 布局支持横屏。 焦点和菜单 在触摸模式里没有焦点,只有轨迹球。Android 平台里没有鼠标焦点。确定你从未显示焦点。主菜单应该包括全部功能;它们与活动联系一起形成整体。菜单上的图标按重要性排序。如果有多于5 个图标,使用点击more menu 菜单来查看那些不太重要的菜单项。上下文菜单(长按)集中在一个特定对象。 总是把那些与所选项最相关的行为放在长按菜单的顶部。 需要记住的几点: 设计时要考虑速度和简洁 尽量分层来分等级 屏幕上的活动尽量最小 使用下载进度条,下载数据时,而不是让用户等待去看一个加载完全的页面。 考虑活动流而不是线性行为 1.3 屏幕上的行为 android 设计了特定的行为方式。在你的应用程序里利用好这一点。应该坚持android 行为的标准,避免混淆用户。 1.4 表达 细节使得产品集中在细节。程序的美学会帮助你集中注意在那些应用体验核心的关键任务上。API DEMO 是开始你的工具包的好地方。 2 用户界面原则 这部分试图讲述创造一个好的用户界面的一些基本的交互设计原则。这些原则是基本的,不止能应用于android 的用户界面设计,也可以应用于其他。苹果建议开发者花费60%的开发时间来进行设计工作。下面的用户界面原则将为好的设计提供一个基础。 2.1 隐喻 隐喻是构建一个基于操作任务心智模型的模块;用它们来传递应用程序的概念和功能。基于真实世界的应用对象可以帮助用户很快的理解该应用程序。当你设计你的应用程序时,要注意andriod 中存在的隐喻,不要重新定义它们。同时,检查你的应用程序执行的任务,看是否有些自然隐喻你可以使用。 2.2 反映用户的心智模型 用户已经有了一个来描述你的程序正在进行的任务的心智模型。这个心智模型产生于真实世界经验、其它软件和一般电脑基本知识的结合。比如说,用户在真实世界里有写字、寄信的经验,也会产生特定的期待,像写一封新的信,选一个接受者,然后寄出信。一个忽略用户心智模型的电子邮件程序用起来会很困难和不舒服。这是因为程序强加给用户一个不熟悉的概念模型,而不是建立一个用户已有的知识经验模式。 在设计程序用户界面之前,试着去发现你的用户的心智模型,这样帮助用户去执行任务。心智模型中内在的隐喻,它代表了任务的概念组成。在写信这个例子中,隐喻包括信件、邮包和信封。在涉及到照片的任务的思考模式中,隐喻包括照片、照相机和专辑。我们要努力地发现用户的期望,包括任务组成、组织、窗口布局的工作流、菜单和工具栏组织、控制面板的使用。 要通过努力地何必把个下面的特征与用户心智模型相融合: 熟悉性 用户的心智模型主要是建立在经验的基础上 简单化 一项任务的心智模型通常是流线型,关注任务的基本组成部分。尽管对于一个给定的任务有很多可选的细节,但是基本的组成部分占大部分,并且不会占用用户的注意。 可利用性Availability 微信主界面的项目设计 一:运行环境:window10操作系统,android studio2.2.2集成开发环境 二:项目整体构思:页面顶部Actionbar图标绘制、页面中间 Viewpage+Fragment容区域、页面底部LinearLayout+TabIndicators自定义View设计 三:文件解读:java类:MainActivity.java(实现各大功能和事件的主类),TabFragment.java(实现显示中间容框架类),ChangeColorIconWithText.java(实现改变图标颜色样式的类)。Xml: activity_main.xml,main.xml,attr.xml,tab_bg.xml等实现页面布局。drawable放置图标文件夹还有工程原有的文件。 四:项目总结:只了解总体的结构,并不能系统的去学习每一个方法或参数,常常因为一些细节,导致编译经常错误,即使利用网络资源也不能很好解决自身的问题,所以今后学习编程,都要有始有终,注重细节,往自己感兴趣的语言发展。 五:部分关键代码如下: 顶部TitleBar构建 新建工程,将需要的图标导入进drawable文件夹 在Value文件夹下string.xml定义字符串常量: Values文件夹下style.xml设置菜单样式 新建menu文件夹创建Main.xml中布局,总体实现顶部查找+符号菜单栏 MainActivity中实现强制显示+功能符号的反射方法 此阶段运行结果如图: ViewPager容区域+底部自定义View 在layout下的activity_main.xml下使用LinearLayout设计底部布局 在LinearLayout中有四个小图标,它的背景background是自定义的tab_bg.xml 一、Android设计常识 开始介绍之前先帮大家梳理一下Android常用单位,方便各位亲们更好的掌握并了解Android端设计规范。 1.1 Android常用单位 1.1.1. PPI(pixels per inch):数字影像的解析度,也就是每英寸所拥有的像素数,即像素密度; PPI计算公式:ppi=√(长度像素数2 + 宽度像素数2)/屏幕对角线英寸数1.1.2. DPI(dots per inch):是指印刷上的计量单位,也就是每英寸上能印刷的网点数,我们设计用于显示器的默认为(72像素/英寸)就好了; 1.1.3. 屏幕尺寸(Screen Size):一般我们所说的手机屏幕尺寸,比如3英寸、5.5英寸等,都是指对角线的长度,而不是手机的面积; 1.1.4. 分辨率(Resolution):是指手机屏幕垂直和水平方向上的像素个数,比如分辨率为:720*1280,是指设备水平方向有720个像素点,垂直方向有1280个像素点 1.1.5. px( pixels):像素,不同设备显示效果相同 1.1.6. pt( point):一个标准的长度单位,ios的逻辑单位,1Pt=1/72英寸,用于印刷业,非常简单易用;标注字体大小(72是早期台式机的DPI) 1.1.7. sp(Scaled-independentpixels):放大像素,安卓的字体单位; 1.1.8. Dp(Density-independentpixels):是指设备的独立像素,不同的设备有不同的显示效果,它与设备硬件有关系; sp和dp基本一样,是android开发里特有的单位,都是为了保证文字在不同密度的显示屏上显示相同的效果;dp与设备硬件有关,与屏幕密度无关,sp与屏幕密度和设备硬件均无关; 淮海工学院计算机工程学院实验报告书 课程名:《手持设备软件开发》 题目:实验2:用户界面程序设计 班级:软件092 学号: 1 姓名: 评语: 成绩:指导教师: 批阅时间:年月日 一、实验目的与要求 掌握Android用户界面程序设计的一般方法; 掌握系统提供的各种View和ViewGroup的基本用法; 掌握使用XML Layout资源创建用户界面的方法; 熟悉ADT用户界面可视化编辑器及Hierarchy Viewer透视图的功能及用法; 理解Android用户界面程序设计中的单线程模型 掌握选项菜单及快捷菜单的创建及菜单子项选择事件的处理方法; 掌握用户界面组件事件处理的一般方法。 二、实验内容 1. 使用ADT创建一个Android Project,并在默认创建的布局资源main.xml中添加一个Button 组件,在程序中该按钮的单击事件处理方法中,执行100万次或更多次的循环,并在每次循环中向LogCat中输出当前循环变量的值和一个[0,1)之间的随机双精度数值。调节循环执行的次数直到产生“应用程序无响应”(ANR:Application Not Responding)错误,并思考产生该错误的原因。 2. 编写一个简单的贷款计算器,根据输入的贷款金额、期限和利率,显示每月应还款的金额。使用android.widget.Toast显示输入数据中的格式错误信息。(可参考文档中Dev Guide的帮助主题Toast Notifications中的内容) 三、实验步骤 1. 实验一(1)新建一个android 项目,打开res文件夹下面的layout文件夹中的main.xml文件,对界面进行编辑,如图1 软件设计开发本栏目责任编辑:谢媛媛Computer Knowledge and Technology 电脑知识与技术第5卷第29期(2009年10月)基于Android 技术的界面设计与研究 赵亮1,张维2 (徐州建筑职业技术学院,江苏徐州221000) 摘要:详细介绍了google 发布的新一代智能手机平台Android 的基本架构,通过对其应用程序构成框架的分析,分析了构成An -droid 应用程序的四种架构块的功能。最后通过对视图和布局的介绍,给出一种使用Android 技术的界面设计实现方案,并通过数据绑定实现了用户事件映射。 关键词:Android ;view ;viewgroup ;数据绑定;布局 中图分类号:TP311文献标识码:B 文章编号:1009-3044(2009)29-8183-03 Research and Design of Interface Based on Android Technology ZHAO Liang 1,ZHANG Wei 2 (Department of Electrionic Information,Xuzhou Institute of Architectural Technology,Jiangsu 221000,China) Abstract:Described in detail the Android that was the basic structure of a new generation smart phones platform of google.By the analysis of its application constitution,we analyze the function of the four kinds of block that compose the Android architecture.Finally through the introduction of the view and layout,present an interface implementation using Android technology and realize the user event mapping by data binding. Key words:Android;view;viewgroup;data binding;layout 随着3G 网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将 会有很大的发展空间。Google 为此于2007年11月推出了一个专为移动设备设计的软件平台——— Android 。Android 是一个针对移动设备的程序集,其中包括一个操作系统,一个中间件和一些关键性应用。 1Android 平台的架构 Android 平台自底向上由以下四个层次组成:Linux 内核层、运行时库和其他库层、应用框架层、应用程序层。如图1所示。 1)Linux 内核层:Android 底层是一个基于Linux 内核来开发的独立操作系统,主要是添加了一个名为Goldfish 的虚拟CPU 以及Android 运行所需的特定驱动代码。该层用来提供系统的底层服务,包括安全机制、内 存管理、进程管理、网络堆栈及一系列的驱动模块。作为一个虚拟的中间层,该层位于硬件 与其它的软件层之间。需要注意的是,这个内核操作系统并非类GNU/Linux 的,所以其系 统库、系统初始化和编程接口都和标准的Linux 系统有所不同的。它没有采用虚拟内存文 件系统,而是采用YAFFS2文件系统。YAFFS2(Yet Another Flash File System)文件系统是一 个开源的专门为NAND Flash 设计的文件系统,具有很好的可移植性,同时也是一种日志 型文件系统。2)Android 运行时库和其他库层:Android 运行时库包含一组核心库和Dalvik 虚拟机 同时Android 提供了丰富的库类支持且大部分为开源代码。 3)应用框架层:在应用框架层Android 开发人员可以跟那些核心应用一样拥有访问框架APIs 的全部权限。应用的系结构化设计简化了各组件之间的重用,任何应用都可以分发自己的组件,任何应用也可以使用这些分发的组件。 4)应用程序层:Android 本身会附带一些核心的应用程序,包括e-mail 客户端、短信程序、日历、地图、浏览器、通讯录等,目前所有的应用程序都是由Java 语言开发的。 2Android 应用程序的构成 对于一个Android 应用程序来说,是由四种构造块组织而成:Activity 、Intent Receiver 、Service 、Content Provider 。但是,并不是每一个Android 应用程序都需要这四种构造块,我们对四种构造块做一些说明: 1)Activity 。Activity 是Android 构造块中最基本的一种。一个activity 通常就是一个单独的屏幕。每一个activity 都被实现为一个独立的类,并且继承于Activity 这个基类。这个activity 类将会显示由几个Views 控件组成的用户接口,并对事件做出响应。大部份的应用都会包含多个的屏幕。Android 使用了Intent 这个特殊类,实现在屏幕与屏幕之间移动。通过解析各种intent ,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity 将会调用startActivity(Intent myIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity 。新的activity 接收到myIntent 的通知后,开始运行。当startActivity 方法被调用将触发解析myIntent 的动作,这个机制提供了两个关键好处:能够重复利用从其它组件中以Intent 的形式产生的一个请求和可以在任何时候被一个具有相同IntentFilter 的新的Activity 取代。 收稿日期:2009-09-16 作者简介:赵亮(1982-),男,江苏徐州人,主要研究方向:移动开发,计算机网络。 图1Android 平台的架构 ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.5,No.29,October 2009,pp.8183-8185E-mail:xsjl@https://www.doczj.com/doc/8613520488.html, https://www.doczj.com/doc/8613520488.html, Tel:+86-551-569096356909648183Android简单的登陆界面的设计开发
第4章 Android用户界面设计
Android界面设计教程
基于Android系统的App界面设计
Android的UI设计
android UI界面设计
Android课程设计
Android UI开发专题
实验2 android的界面设计(控件与布局)
Android人机界面设计规范
微信主界面Android项目设计文档
APP界面设计规范二(Android版)
android用户界面程序设计
基于Android技术的界面设计与研究