日期:2012-4-7 来源:GBin1.com
设计中我们经常使用各种书法字体,但是这种书法字体并不是很常见。本篇文章中我们收集了30个超棒的英文书法字体作品,希望大家喜欢!
Ornamental LetteringWelcome to Transylvania
Poems in Calligraphy
...
原文来自:分享30个带给你灵感的书法作品
makefile还有一些系统的函数,在此就不一一列举l了。今天学习学习伪目标和隐含规则。
1.伪目标
在第一讲中的例子中有如下代码:
clean: rm edit main.o kbd.o
这里“clean”就是一个伪目标。
我们在编译的过程中生成了许多编译文件,那么也应该提供一个清除它们的“目标”以备完整的重新编译而用。(例如:make clean实现文件的清除)。
因为我们并不生成“clean”这个文件,所以称其为“伪目标”。
- “伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。所以我们只有通过显示的指明这个“目标”才能让其生效。
- “伪目标”的取名不能和文件名重名,否则就失去了“伪目标”的意义了。
为了避免和文件重名,我们可以使用一个特殊的标记,“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。例如:
只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”。于是整个过程可以这样写:
.PHONY:clean clean: rm *.o temp
- 伪目标一般没有依赖文件。但是我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”
all:prog1 prog2 prog3 .PHONY:all prog1:prog1.o utils.o cc -o prog1 prog1.o utils.o prog2:prog2.o cc -o prog2 prog2.o prog3:prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o一些约定俗成的伪目标:(当然也可以重新命名而不使用这些名称)
- all:这个伪目标是所有目标的目标,其功能一般是编译所有的目标
- clean:这个伪目标的功能是删除所有被make创建的文件
- install:这个伪目标的功能是安装已经编译好的程序,其实就是把目标执行文件copy到指定目标中去
- print:这个伪目标的功能是列出改变过的源文件
- tar:这个伪目标的功能是把源程序打包备份,也就是一个tar文件
- dist:这个伪目标的功能是创建一个压缩文件,一般是把tar文件压成z文件或者gz文件
- TAGS:这个伪目标的功能是更新所有的目标,以备完整的重新编译使用
- check和test这个伪目标一般用来测试makefie的流程
2.隐含规则
“隐含规则”也就是早先约定了的,不需要我们写出来的规则,它是一种惯例。例如,把[.c]文件编译成[.o]文件这个规则,就可以不用写出来,make会自动推导出这种规则,并生成我们需要的[.o]文件。
例如:
foo:foo.o bar.o cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
以上的代码中并没有写下如何生成foo.o bar.o这两个目标的规则和命令
- CFLAGS:C语言编译器的参数。
- LDFLAGS:链接器参数
- 如果我们 [.o]文件书写了自己的规则,那么make就不会自动推导并调用隐含规则了。
- 在make的“隐含规则库”中,每一条隐含规则都在库中有其顺序,越靠前的则是越被经常使用的,所以,这会导致我们有些时候即使我们显示地指定了目标依赖,make也不会管。
foo.o:foo.p依赖文件“foo.p”有可能变得没有意义。 如果目录下存在 了“foo.c”文件,那么我们的隐含规则一样会生效,并会通过“foo.c”调用C的编译器生成foo.o文件。 因为,在隐含规则中,Pascal的规 则出现在C的规则之后,所以,make找到可以生成foo.o的C的规则就不再寻找下一条规则了。
所以如果确实不希望任何隐含规则推导,则需要明确写出命令。
就写到这啦,下次继续,因为这个我理解的还很浅显啦!
使用过ListView 的开发人员都知道,ListView 在一般情况下只能对每条记录设置一个监听事件。如果想在其中添加多个事件,就需要自定义Adapter 。
下面介绍一下如何自定义adapter 以及如何在一个Item 中绑定多个事件。
这里我们需要两个XML 文件、两个java 类。分别是存放ListView 的XML 、ListViewItem 的XML 、Activity 类和Adapter 类。
首先说说两个XML 文件。
main.xml
<?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:padding= "10dip" android:orientation="vertical" > <ListView android:id="@id/android:list" android:layout_width = "fill_parent" android:layout_height = "fill_parent" /> </LinearLayout>
注意:这里的ListView 中id 使用了android 自定义的: @id/android:list
lvItem.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" android:padding="5dip" > <ImageView android:id="@+id/ItemImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dip" /> <ImageButton android:id="@+id/ItemCloseWin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/ItemWinName" android:layout_alignTop="@+id/ItemWinName" android:layout_alignParentRight="true" android:background="#e0000000" android:focusable="false" android:gravity="left|center_vertical" android:src="/blog_article/@android_drawable/ic_menu_close_clear_cancel/index.html" /> <ImageButton android:id="@+id/ItemEmail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/ItemWinName" android:layout_alignTop="@id/ItemWinName" android:layout_toLeftOf="@id/ItemCloseWin" android:background="#e0000000" android:focusable="false" android:gravity="left|center_vertical" android:src="/blog_article/@android_drawable/ic_dialog_email/index.html" /> <TextView android:id="@+id/ItemWinName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/ItemImage" android:layout_alignTop="@id/ItemImage" android:layout_toLeftOf="@id/ItemEmail" android:layout_toRightOf="@id/ItemImage" android:gravity="left|center_vertical" android:text="title" android:textSize="20dip" /> </RelativeLayout>
接下来看看Activity
package cn.mutil; import java.util.ArrayList; import java.util.HashMap; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; /** * ListView item 多事件Activity * @author lihua * */ public class LvWithButtonActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 关联Layout中的ListView ListView vncListView = (ListView) findViewById(android.R.id.list); // 生成动态数组,加入数据 ArrayList<HashMap<String, Object>> remoteWindowItem = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < 10; i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemImage", R.drawable.ic_launcher); // 图像资源的ID map.put("ItemWinName", "Window ID " + i); map.put("ItemEmail", android.R.drawable.ic_dialog_email); map.put("ItemCloseWin", android.R.drawable.ic_menu_close_clear_cancel); remoteWindowItem.add(map); } // 生成适配器的Item和动态数组对应的元素 LvButtonAdapter listItemAdapter = new LvButtonAdapter(this, remoteWindowItem, // 数据源 R.layout.lvitem, // ListItem对应的XML // 动态数组与ImageItem对应的子项 new String[] { "ItemImage", "ItemWinName","ItemEmail", "ItemCloseWin" }, // ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] { R.id.ItemImage, R.id.ItemWinName, R.id.ItemEmail, R.id.ItemCloseWin }); vncListView.setAdapter(listItemAdapter); /** * 设置整个Item被点击的事件 * 该事件在其他有事件的组件未被点击时触发 */ vncListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View view, int position,long arg3) { TextView content = (TextView)view.findViewById(R.id.ItemWinName); Toast.makeText(LvWithButtonActivity.this, content.getText().toString() , Toast.LENGTH_SHORT).show(); } }); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); l.getItemAtPosition(position); } }
最后一个也是最重要的一个,自定义adapter
package cn.mutil; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class LvButtonAdapter extends BaseAdapter { private class ButtonViewHolder { ImageView appIcon; TextView appName; ImageButton buttonEmail; ImageButton buttonClose; } private ArrayList<HashMap<String, Object>> mAppList;//用于存放传递过来显示于ListView中的 数据 private LayoutInflater mInflater; private Context mContext; private String[] keyString; private int[] valueViewID; private ButtonViewHolder holder; public LvButtonAdapter(Context c,//上下文 ArrayList<HashMap<String, Object>> appList,//绑定数据 int resource00000,//ListView行记录layout String[] from, int[] to) { mAppList = appList; mContext = c; mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); keyString = new String[from.length]; valueViewID = new int[to.length]; System.arraycopy(from, 0, keyString, 0, from.length); System.arraycopy(to, 0, valueViewID, 0, to.length); } @Override public int getCount() { return mAppList.size(); } @Override public Object getItem(int position) { return mAppList.get(position); } @Override public long getItemId(int position) { return position; } /** * 删除数据集中的值 * @param position */ public void removeItem(int position) { mAppList.remove(position); this.notifyDataSetChanged(); } /** * 改变数据集中的值 * @param position * @param map */ public void changeItem(int position,HashMap<String, Object> map){ mAppList.remove(position); mAppList.add(position, map); this.notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView != null) { holder = (ButtonViewHolder) convertView.getTag(); } else { convertView = mInflater.inflate(R.layout.lvitem, null); holder = new ButtonViewHolder(); holder.appIcon = (ImageView) convertView .findViewById(valueViewID[0]);//可以将valueViewID[0]替换成R.id.xxx holder.appName = (TextView) convertView .findViewById(valueViewID[1]); holder.buttonEmail = (ImageButton) convertView .findViewById(valueViewID[2]); holder.buttonClose = (ImageButton) convertView .findViewById(valueViewID[3]); convertView.setTag(holder); } HashMap<String, Object> appInfo = mAppList.get(position); if (appInfo != null) { String aname = (String) appInfo.get(keyString[1]); int mid = (Integer) appInfo.get(keyString[0]); int eid = (Integer) appInfo.get(keyString[2]); int bid = (Integer) appInfo.get(keyString[3]); holder.appName.setText(aname); holder.appName.setOnClickListener(new LvButtonListener(position)); holder.appIcon.setImageDrawable(holder.appIcon.getResources().getDrawable(mid)); holder.buttonEmail.setImageDrawable(holder.buttonEmail.getResources().getDrawable(eid)); holder.buttonEmail.setOnClickListener(new LvButtonListener(position)); holder.buttonClose.setImageDrawable(holder.buttonClose.getResources().getDrawable(bid)); holder.buttonClose.setOnClickListener(new LvButtonListener(position)); } return convertView; } /** * 按钮事件监听 * @author lihua * */ private class LvButtonListener implements View.OnClickListener { private int position; LvButtonListener(int pos) { position = pos; } @Override public void onClick(View v) { int vid = v.getId(); HashMap<String, Object> curMap = (HashMap<String, Object>)getItem(position); if (vid == holder.buttonClose.getId()){ //删除一行记录 Toast.makeText(mContext,"position:"+position+",data is being Deleted", Toast.LENGTH_LONG).show(); removeItem(position); //可以在这里操作数据库或更新服务端数据 }else if(vid == holder.buttonEmail.getId()){//发送邮件 Toast.makeText(mContext, "position:"+position+",sending email to xxx!", Toast.LENGTH_SHORT).show(); //可以在这里操作数据库或更新服务端数据 }else if(vid == holder.appName.getId()){//设置名称 Toast.makeText(mContext, "position is "+position+", appName:"+curMap.get("ItemWinName").toString(), Toast.LENGTH_SHORT).show(); curMap.put("ItemWinName", System.currentTimeMillis()+""); changeItem(position,curMap); //可以在这里操作数据库或更新服务端数据 } } } }