初学Android,使用属性(Attribute)资源(二十二)

 

感觉这篇写的不错,拿来转了

属性(Attribute)资源:属于整个Android应用资源的一部分.其实就是网上一堆介绍怎么给自定义View添加自己的属性文章里的attrs文件,此文件位于../res/values/目录下

当别人通过XML文件配置的方式来创建你开发的自定义组件,并且还能动态设置你自定义组件的属性时,这时候你就需要给你自己自定义的组件配上一个XML属性资源文件来完成这项工作了.

其实也可以不配上一个XML属性资源文件,也能完成如上的功能,这样你的自定义组件显得更干脆一点,一个自定义组件就是一个类文件,不拖泥带水的。但是这两种方式是有区别的,具体看自己的需求来选择了,以下为两种实现方式:

1:配合XML属性资源文件的方式
第一步:attrs.xml文件
首先当然是要写出自定义组件的类文件了,然后将这个类里需要外界传入值的属性定义成一个属性资源文件.
在工程里的../res/values/目录下创建一个attrs.xml文件,文件名并不是只能写成这样,这样写只有一个目的,别人一看就知道这个文件是属性资源文件了,具体写法如下:

Xml代码

收藏代码

  1. xmlversion=“1.0”encoding=“utf-8” >
  2. <resources>
  3. <attrname=“test1”format=“string”/>
  4. <declare-styleablename=“MyView”>
  5. <attrname=“textColor”format=“color”/>
  6. <attrname=“textSize”format=“dimension”/>
  7. <attrname=“text”format=“string”/>
  8. </declare-styleable>
  9. </resources>

attrs.xml解释如下

Java代码

收藏代码

  1. attr子元素:
  2. 定义具体的属性,format表示这个属性的值的类型,类型有以下几种:
  3. 1.reference:参考指定Theme中资源ID,这个类型意思就是你传的值可以是引用资源
  4. 2.string:字符串,如果你想别人既能直接写值也可以用类似“@string/test”引用资源的方式,可以写成format=“string|reference”
  5. 3.Color:颜色
  6. 4.boolean:布尔值
  7. 5.dimension:尺寸值
  8. 6.float:浮点型
  9. 7.integer:整型
  10. 8.fraction:百分数
  11. 9.enum:枚举,如果你提供的属性只能让别人选择,不能随便传入,就可以写成这样
  12. <attrname=“language”>
  13. <enumname=“china”value=“1”/>
  14. <enumname=“English”value=“2”/>
  15. </attr>
  16. 10.flag:位或运算
  17. declare-styleable子元素:
  18. 定义一个styleable对象,每个styleable对象就是一组attr属性的集合注意:这里的name属性并不是一定要和自定义类名相同,只是为了好区分对应类的属性而已
  19. 注意:上面的属性资源文件定义了该属性之后,至于到底是哪个自定义View组件中来使用该属性,该属性到底能发挥什么作用,就不归该属性资源文件管了,也就是说这个属性资源文件是个公共的,大家都可以用,但是为了方便管理,一般都是一个自定义View里的属性写成一个declare-styleable集合.属性资源所定义的属性到底可以返回什么作用,取决于自定义组件的代码实现

第二步:在自定义类里引用attrs文件里定义的属性为自己的属性设置值

Java代码

收藏代码

  1. packagecn.com.androidtest.ui;
  2. importcn.com.androidtest.R;
  3. importandroid.content.Context;
  4. importandroid.content.res.TypedArray;
  5. importandroid.graphics.Canvas;
  6. importandroid.graphics.Color;
  7. importandroid.graphics.Paint;
  8. importandroid.graphics.Paint.Style;
  9. importandroid.graphics.Rect;
  10. importandroid.util.AttributeSet;
  11. importandroid.view.View;
  12. publicclassMyViewextendsView
  13. {
  14. privatePaintmPaint;
  15. privateContextmContext;
  16. privatestaticStringmString;
  17. privateStringtest;
  18. publicMyView(Contextcontext)
  19. {
  20. super(context);
  21. mPaint=newPaint();
  22. }
  23. publicMyView(Contextcontext,AttributeSetattrs)
  24. {
  25. super(context,attrs);
  26. mPaint=newPaint();
  27. /*这里取得declare-styleable集合*/
  28. TypedArraytypeArray=context.obtainStyledAttributes(attrs,R.styleable.MyView);
  29. /*这里从集合里取出相对应的属性值,第二参数是如果使用者没用配置该属性时所用的默认值*/
  30. inttextColor=typeArray.getColor(R.styleable.MyView_textColor,0XFFFFFFFF);
  31. floattextSize=typeArray.getDimension(R.styleable.MyView_textSize,36);
  32. mString=typeArray.getString(R.styleable.MyView_text);
  33. /*设置自己的类成员变量*/
  34. mPaint.setTextSize(textSize);
  35. mPaint.setColor(textColor);
  36. /*关闭资源*/
  37. typeArray.recycle();
  38. }
  39. @Override
  40. protectedvoidonDraw(Canvascanvas)
  41. {
  42. super.onDraw(canvas);
  43. mPaint.setStyle(Style.FILL);
  44. canvas.drawRect(newRect(10,10,90,90),mPaint);
  45. mPaint.setColor(Color.BLUE);
  46. canvas.drawText(mString,10,110,mPaint);
  47. }
  48. }

第三步:使用自定义组件,并设置属性

Xml代码

收藏代码

  1. xmlversion=“1.0”encoding=“utf-8” >
  2. <LinearLayout
  3. xmlns:android=“http://schemas.android.com/apk/res/android”
  4. xmlns:myandroid=“http://schemas.android.com/apk/res/cn.com.androidtest”
  5. android:orientation=“vertical”
  6. android:layout_width=“fill_parent”
  7. android:layout_height=“fill_parent”
  8. >
  9. <TextView
  10. android:layout_width=“fill_parent”
  11. android:layout_height=“wrap_content”
  12. android:text=“@string/hello”/>
  13. <cn.com.androidtest.ui.MyView
  14. android:layout_width=“fill_parent”
  15. android:layout_height=“wrap_content”
  16. myandroid:textColor=“#ff0000”
  17. myandroid:textSize=“20px”
  18. myandroid:text=“http://wujiandong.iteye.com”/>
  19. </LinearLayout>

注意:java代码里那种取属性值的方式,那么在XML使用该组件的时候一定要为该自定义组件设置一个命名空间[xmlns:myandroid=”http://schemas.android.com/apk/res/cn.com.androidtest”],不然组件属性设置不了
命名空间写法:xmlns:空间名=”http://schemas.android.com/apk/res/自定义组件所在包名”
写包名时候也有个要注意的地方:
如果你的自定义View所在包类似如下两图,那么包名只能写成最顶层包[cn.com.androidtest],而不能是[cn.com.androidtest.ui]

第四步:终于完成了,看下效果图

2:不需要配合XML资源文件的方式
基本与第一种方式相同,只是java代码取属性值的部分,和别人用你自义View时有点区别

java代码写法:

Java代码

收藏代码

  1. /*资源ID号引用*/
  2. intresouceId=-1;
  3. /*取得资源ID号,第一个参数:命名空间名.第二个参数:xml文件里设置的属性名.第三个参数:默认值*/
  4. resouceId=attrs.getAttributeResourceValue(null,“textColor”,0);
  5. if(resouceId>0)
  6. textColor=context.getResources().getColor(resouceId);
  7. resouceId=attrs.getAttributeResourceValue(null,“textColor”,0);
  8. if(resouceId>0)
  9. mString=context.getResources().getText(resouceId,“http://wujiandong.iteye.com”).toString();

XML中使用的时候,命名空间可以不要,属性名就要自己对应好了,不然程序取不到,不像有XML资源文件配合的方式有个约束.绝对自由等于没有自由~~

Xml代码

收藏代码

  1. <cn.com.androidtest.ui.MyView
  2. android:layout_width=“fill_parent”
  3. android:layout_height=“wrap_content”
  4. textColor=“#ff0000”
  5. textSize=“20px”
  6. text=“http://wujiandong.iteye.com”/>

     

    ASIHTTPRequest类库的使用

    以前,写了一篇关于服务端请求的文章:IOS中请求服务器端方法,使用的是iOS SDK中的API,调用起来比较繁琐,这篇文章主要是关于通过ASIHTTPRequest类库请求服务端的方法。

     

    ASIHTTPRequest是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。

     

    ASIHTTPRequest的功能很强大,主要特色如下:

     

    通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作

    下载的数据,可存储到内存中或直接存储到磁盘中

    能上传本地文件到服务端

    可以方便的访问和操作请求和返回的Http头信息

    可以获取到上传或下载的进度信息,为应用程序提供更好的体验

    支持上传或下载队列,并且可获取队列的进度信息

    支持基本、摘要和NTLM身份认证,在同一会话中授权凭证会自动维持,并且可以存储在Keychain中

    支持Cookie

    当应用在后台运行时,请求可以继续运行

    支持GZIP压缩数据

    内置的ASIDownloadCache类,可以缓存请求返回的数据,这样即使没有网络也可以返回已经缓存的数据结果

    ASIWebPageRequest可以下载完整的网页,包括包含的网页、样式表、脚本等资源文件,并显示在UIWebView/WebView中。任意大小的页面都可以无限期缓存,这样即使没有网络也可以离线浏览

    支持客户端证书

    支持通过代理发起Http请求

    支持带宽限制。在iOS平台,可以根据当前网络情况来自动决定是否限制带宽,例如当使用WWAN(GPRS/Edge/3G)网络时限制,而当使用WIFI时不做任何限制

    支持断点续传

    支持同步和异步请求

     

    官网地址:http://allseeing-i.com/ASIHTTPRequest/

     

    如果想在iOS项目中使用ASIHTTPRequest,需要在项目中进行简单的配置。

     

    1、将ASIHTTPRequest的相关文件加入项目中,所需文件列表如下:

     

    ASIHTTPRequestConfig.h

    ASIHTTPRequestDelegate.h

    ASIProgressDelegate.h

    ASICacheDelegate.h

    ASIHTTPRequest.h

    ASIHTTPRequest.m

    ASIDataCompressor.h

    ASIDataCompressor.m

    ASIDataDecompressor.h

    ASIDataDecompressor.m

    ASIFormDataRequest.h

    ASIInputStream.h

    ASIInputStream.m

    ASIFormDataRequest.m

    ASINetworkQueue.h

    ASINetworkQueue.m

    ASIDownloadCache.h

    ASIDownloadCache.m

    ASIAuthenticationDialog.h

    ASIAuthenticationDialog.m

    Reachability.h

    Reachability.m

     

    2、将相关的类库加入项目中,列表如下:

     

    SystemConfiguration.framework

    MobileCoreServices.framework

    CoreGraphics.framework

    CFNetwork.framework

    libxml2.dylib

    libz.dylib

     

    3、Search Paths中的Header Search Paths设置为:${SDK_DIR}/usr/include/libxml2

     

    ASIHTTPRequest有很多功能,所有功能说明都可以在其官方网站的相关文档中查到,本文仅简单介绍一下如何使用ASIHTTPRequest来进行同步Http请求和异步Http请求。

     

    在需要使用ASIHTTPRequest的头文件中加入以下代码:

     

    #import "ASIHTTPRequest.h"

     

    这样就可以在代码中使用ASIHTTPRequest相关的类了。

     

    创建一个同步请求

     

    这是ASIHTTPRequest最简单的一种使用模式,发送startSynchronous消息后即开始在同一线程中执行HTTP请求,线程将一直等待直到请求结束(请求成功或者失败)。通过检查error属性可以判断请求是否成功或者有错误发生。

    要获取返回的文本信息,调用responseString方法。如果下载的是二进制文件,例如图片、MP3,则调用responseData方法,可以得到一个NSData对象。

     

    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request startSynchronous];
    NSError *error = [request error];
    if (!error) {
        NSString *response = [request responseString];
    }

     

    创建一个异步请求

     

    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request startAsynchronous];
    
    - (void)requestFinished:(ASIHTTPRequest *)request {
        // 当以文本形式读取返回内容时
        NSString *responseString = [request responseString];
        // 当以二进制形式读取返回内容时
        NSData *responseData = [request responseData];
    }
    
    - (void)requestFailed:(ASIHTTPRequest *)request {
        NSString *message = NULL;
    
        NSError *error = [request error];
        switch ([error code]) {
            case ASIRequestTimedOutErrorType:
                message = kAlertMsgTimeoutError;
                break;
            case ASIConnectionFailureErrorType:
                message = kAlertMsgConnectionFailError;
                break;   
            case ASIAuthenticationErrorType:
                message = kAlertMsgAuthFailError;
                break;   
            case ASITooMuchRedirectionErrorType:
                message = kAlertMsgTooManyRedirect;
                break;   
            case ASIRequestCancelledErrorType:
                message = kAlertMsgReqCancelledError;
                break;   
            case ASIUnableToCreateRequestErrorType:
                message = kAlertMsgUnableCreateReqError;
                break;   
            case ASIInternalErrorWhileBuildingRequestType:
                message = kAlertMsgUnableBuildReqError;
                break;   
            case ASIInternalErrorWhileApplyingCredentialsType:
                message = kAlertMsgUnableApplyCredError;
                break;   
            case ASIFileManagementError:
                message = kAlertMsgFileManageError;
                break;  
            case ASIUnhandledExceptionError:
                message = kAlertMsgUnhandledExcepError;
                break;
            case ASICompressionError:
                message = kAlertMsgCompressionError;
                break;
            default:
                message = kAlertMsgGenericError;
                break;
        }
    
        if (NULL != message) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:kApplicationTitle
                                                            message:message
                                                           delegate:self
                                                  cancelButtonTitle:kAlertDefaultCancel
                                                  otherButtonTitles:nil];
            [alert show];
        } 
    }

     

    Android开发指南-用户界面-通用布局对象

    通用布局对象Common Layout Objects

    本章描述了可用于你的应用程序的一些更为通用的布局对象类型。像所有的布局一样,它们是ViewGroup.的子类。

    也可以参见Hello Views 教程,有更多关于使用Android视图布局的指南。

    框架布局FrameLayout

    框架布局FrameLayout 是最简单的布局对象类型。它基本上是一个屏幕上的空白空间,你可以稍后填充一个对象比如,一个切入切出的图片。所有框架布局的子元素被钉在屏幕左上角;你不能为子视图指定一个不一样的位置。后续的子视图只是简单在之前的视图上方绘制,部分或完全的掩盖它们(除非这个新的对象是透明的)。

    线性布局LinearLayout

    线性布局LinearLayout 在单一方向上对齐所有的子视图竖向或者横向,这依赖于你怎么定义方向orientation 属性。所有子视图依次堆积,所以一个竖向列表每行只有一个子视图,不管它们有多宽,而一个横向列表将只有一行高(最高子视图的高度,加上填充)。一个线性布局LinearLayout 会考虑子视图之间的边缘空白margins以及每个子视图的引力属性(靠右,居中,或者靠左)。

    线性布局LinearLayout也支持给每个单独的子视图分配一个权重。这个属性分配一个“重要性”数值给一个视图,并允许它扩展来填充父视图的任何剩余空间。子视图可以指定一个整型权重值,然后任何这个视图组中的剩余空间将按照子视图声明的比重来分配给它们。缺省权重是0。比如,如果有三个文本框,其中两个声明权重为1,而另一个未给定数值(0),这第三个没有权重的文本框将不会增长而只是占据其内容所要求的空间。其它两个将均匀分配剩余的空间。如果把第三个控件权重改为2,那意味着它被声明为比其它两个“更为重要”,因此它将占据整个空间的一半,而前面两个均分剩下的空间。

    提示:要在屏幕上创建一个均衡尺寸的布局,可创建一个容器视图组对象,其layout_width layout_height 属性设置为fill_parent; 把子视图的heightwidth 赋值为0 然后根据比例为每个子视图分配相关的weight 值。

    下面的两个窗体呈现了一个带有若干元素的线性布局LinearLayout:一个按钮,一些标签和文本框。这些文本框把它们的宽度设置为填充父视图(fill_parent;其他元素设置为包含内容(wrap_content。引力属性为缺省的靠左对齐。这两个窗体的区别是左边的那个没有设置权重,而右边那个窗体中,评论文本框权重被设置为1。如果名字也设置成1,那么名字和评论将一样高。

    android linear layout

    在一个水平方向的线性布局LinearLayout中,items按照文本底线位置来对齐(第一个元素的第一行最上边或最左边被当作参考行)。这样用户在窗体中浏览元素时并不需要上下跳动来阅读相邻元素中的文本。这个特性可以通过在XML布局中设置android:baselineAligned=”false”来关闭。

    要查看其他示例代码,参见Hello LinearLayout教程。

    表布局TableLayout

    表布局TableLayout把它的子视图定位到行和列中。表布局容器不显示行,列和单元的边界线。表的列和最多行单元数一样多。一个表可以有空单元,但是单元不能像HTML里面那样跨列。

    TableRow 对象是一个TableLayout的子视图(每个TableRow定义了表中的一个单独行)。每行有0或多个单元,可用任何其他视图定义。因此,行单元可能由各个视图对象组成,如ImageViewTextView对象。一个单元也可以是一个ViewGroup对象(比如,你可以嵌入另一个表布局作为一个单元)。

    下面的示例布局有两行,各有两个单元。旁边的截图显示了效果,单元边界被显示为虚线(为了增加视觉效果)。

    android table layout

    < xml version=”1.0″ encoding=”utf-8″ >

    <TableLayout xmlns:android=”http://schemas.android.com/apk/res/android”

    android:layout_width=”fill_parent”

    android:layout_height=”fill_parent”

    android:stretchColumns=”1″>

    <TableRow>

    <TextView

    android:text=”@string/table_layout_4_open”

    android:padding=”3dip” />

    <TextView

    android:text=”@string/table_layout_4_open_shortcut”

    android:gravity=”right”

    android:padding=”3dip” />

    </TableRow>

    <TableRow>

    <TextView

    android:text=”@string/table_layout_4_save”

    android:padding=”3dip” />

    <TextView

    android:text=”@string/table_layout_4_save_shortcut”

    android:gravity=”right”

    android:padding=”3dip” />

    </TableRow>

    </TableLayout>

    列可以被隐藏,带有延伸标记并填充可用屏幕空间,或者可以被标记为可收缩来强制这个列缩小直到表适合屏幕。参见TableLayout reference 文档获取更多信息。

    示范代码,参见Hello TableLayout教程。

    相对布局RelativeLayout

    相对布局RelativeLayout允许子视图指定它们和父视图或彼此之间的相对位置(通过ID指定)。因此你可以按正确的顺序对齐两个元素,或者让一个视图在另外一个下面,居于屏幕中间,左边的中间,等等。元素通过给定顺序来绘制,因此如果这第一个元素在屏幕中间,其他以它对齐的元素都会对齐到屏幕中间。同样,因为这个顺序,如果使用XML来指定这个布局,你将引用的元素(为了定位其它视图对象)必须被列在XML文件中,在你通过引用ID从其他视图中引用它之前。

    这个下面的例子显示了一个XML文件及其界面效果。注意,在属性中引用相对元素(比如,layout_toLeft)时使用了一个相对资源语法来引用ID@id/id)。

    < 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:background=”@drawable/blue”

    android:padding=”10px” >

    <TextView android:id=”@+id/label”

    android:layout_width=”fill_parent”

    android:layout_height=”wrap_content”

    android:text=”Type here:” />

    <EditText android:id=”@+id/entry”

    android:layout_width=”fill_parent”

    android:layout_height=”wrap_content”

    android:background=”@android:drawable/editbox_background”

    android:layout_below=”@id/label” />

    <Button android:id=”@+id/ok”

    android:layout_width=”wrap_content”

    android:layout_height=”wrap_content”

    android:layout_below=”@id/entry”

    android:layout_alignParentRight=”true”

    android:layout_marginLeft=”10px”

    android:text=”OK” />

    <Button android:layout_width=”wrap_content”

    android:layout_height=”wrap_content”

    android:layout_toLeftOf=”@id/ok”

    android:layout_alignTop=”@id/ok”

    android:text=”Cancel” />

    </RelativeLayout>

    其中一些特性直接由元素支持,另外一些由它的LayoutParams成员变量支持(为所有这个屏幕中的元素子类化RelativeLayout,因为所有元素都是RelativeLayout父对象的子元素)。已定义的相对布局RelativeLayout参数是:width, height, below, alignTop, toLeft, padding[Bottom|Left|Right|Top],以及 margin[Bottom|Left|Right|Top]。注意其中一些参数明确支持相对布局位置它们的数值必须是你的相对位置元素的ID。比如,为一个TextView分配参数toLeft=”my_button” 将把TextView放在视图IDmy_button的左边(这必须写在XML中的TextView前面)。

    示范代码,参见Hello RelativeLayout 教程。

    关于重要视图组的总结Summary of Important View Groups

    下面这些对象都用来容纳用户界面元素。一些提供了自己的可见界面格式,而其他一些是不可见的结构,仅仅用来管理子视图的布局。

    描述

    框架布局FrameLayout

    作为一个视图框架来显示一个单独的对象。

    画廊Gallery

    一个水平滚动的图像显示。

    网格视图GridView

    显示一个滚动网格mn行。

    线性布局LinearLayout

    一个把子视图组织进单个水平或竖向行的布局。它创建一个滚动条如果窗口长度超过屏幕长度的话。

    列表视图ListView

    显示一个滚动单列列表。

    相对布局RelativeLayout

    使你可以指定子对象之间的相对位置(如,AB的左边)或者相对于父对象的位置(如,与父视图顶部对齐)

    滚动视图ScrollView

    一个竖向的滚动元素列。

    微调器Spinner

    从一组数据中每次显示一个单独的项,在一个单行的文本框里。很像可以横向或竖向滚动的单行列表框。(译注:这个并不是windows平台通常理解的那个用来上下调整数值的小控件Spin Control,虽然名字很相近)

    平面视图SurfaceView

    提供一个专门的绘画平面的直接访问。它可以含有子视图层叠在这个平面上,但通常是为了给需要直接画像素的应用程序使用,而不是直接使用部件。

    标签栏TabHost

    提供一个标签选择列表,监控用户点击动作并使得应用程序在一个标签被点击时改变屏幕显示。

    表布局TableLayout

    一个表布局含有任意数量的行和列,每个单元包含你选择的部件。行的尺寸会自动调整来适应最大的列。单元边界不可见。

    翻转视图ViewFlipper

    一个一次只显示一项的列表,在一个单行文本框里。它可以被设置成定期切换items,就像幻灯片那样。

    切换视图ViewSwitcher

    和翻转视图一样。

    【转载】牛人们如何让自己Blog流量爆涨-经验谈

    如何增加Blog读者数近日,国外一牛人 Guy Kawasaki 写了一篇 The 120 Day Wonder:How to Evangelize a Blog ,此文引起了不少知名Blogger的注意。

    为什么呢? 因为这人特别 特别 特别的牛!

    他的Blog只花了120天,就取得了如此成绩:Technorati 上7,388个反向链接、FeedBurner订阅数 5,692、Email订阅数785、页面访问量706,597 (06年4月23日数据)。

    如此超级牛人写的Blogging经验自然是很有参考价值的,下面是其原文提到的10大要点和Yee的一些想法。

    1.把Blog当成”书”而不是”日记” -
    日记上的东西一般是个人的随想和感受,除非你是焦点人物(如明星、政客、绯闻主角等),否则你的日记对大多数人来说并没有多少吸引力。相对的,如果你是以
    写书的态度来写Blog,那么自然会更加注重表达形式和内容结构,更注意文章的可读性。

    2.回应那些爱找茬的家伙 - 不可否认,有些人就喜欢往鸡蛋里挑骨头,他们热衷于发扬吹毛求疵的批判主义精神,以挫伤你的信心为自己的快乐之道。对于这类人,Guy Kawasaki 持明确的反击态度。

    不过,Yee建议大家还是三思而后行。在对这些人进行还击时应谨慎,小心被他们借题发挥。如果一不小心像沈阳那样卷入麻烦的官司,那么无疑会给你的个人形象带来一定影响。

    3.收集E-MAIL地址 - 据说,国外的一些顶级Blogger有收集 E-MAIL
    地址的癖好。这样一来可以进行初步宣传,二来可以在出现特殊情况时(如Blog故障无法访问)告知关心自己的读者。Guy Kawasaki
    原文中提到,在他开始Blogging之初,曾一口气给 10,000 个E-MAIL发出通知,由此引来了第一批读者。

    这个方法看上去很不错,然而有很大的争议性,操作不当可能会被别人当成垃圾邮件,从而留下难以磨灭的不良印象。(反面教材:donews inout)

    4.收集友情链接 - 搞不懂为什么 Guy Kawasaki 会这么说,可能是为了凑足10大要点吧。坦白讲,如果是为了流量或吸引读者而采取这个方法的话,那真是太没深度了。

    Yee认为与其把精力放在实际收效甚微的友情链接上,倒不如往别人的Blog上贴几个精彩评论,这样既可以有效吸引别人的注意力,又可以加深别人对你的印象,还可以挖掘你的潜在读者。这招要求操作者有较高的技术含量和语言表达能力,难度指数-中上。

    5.写独具特色的东西 - 这可能是最有效吸引其他Blogger和读者的方法。当你写出了一篇极有使用价值或者很有争议性的文章时,其他持相同或不同观点的 Blogger 可能会据此发表自己的见解。如此,你的Blog和知名度自然在网上传开了。

    比如前一阵子Yee搞了一个”博客众生相”,结果原文链接很快就出现在其他Blog上,一下子就提高了自己的知名度。这种机会常常是可遇不可求的,除了要求Blogger有很强的综合能力外,还需要一点运气。 难度指数-上。

    6.在文末补上其他Blogger的相关链接 - Blog的一个好处就是可以让大家很方便的对一些问题进行讨论。对同一件事不同Blogger有不同看法,多和别人探讨这些问题,然后把大家的想法串联起来这样可以让你的文章观点更加丰富。

    7.重视你的评论 -
    评论是Blog维系读者的少数渠道之一,其重要性不言而喻。从心里角度讲,别人之所以在你的Blog上留下评论的很大一个原因是想得到你的回应,跟你进行
    交流。如果对此你都不理不睬,那么别人会怎么想?尽管对于一些很知名的Blogger来说,他们不可能对大多数评论进行回应,但是蜻蜓点水般地回答几个问
    题还是做得到的。

    8.向别人寻求帮助 -
    如果你在Blogging过程中遇到困难(不论是写作上、技术上还是其他方面的),就应该要大胆地、虚心地向你的读者求助。这样不仅有助于及早你问题的解
    决,还能够加强跟读者的交流互动。从一个忠实读者的角度看,能参与组织自己关注的Blog对他们来说也是件有意义的事情。

    9.坚持自己的观点 - Guy Kawasaki 相信在Blog上发表的言论就是泼出去的水,收不回来也不必收回来。坚持自己的观点对Blogger来说确实是比较重要的,因为摇摆不定的态度说明你在迷茫,迷茫中的人写的东西很难引起读者的兴趣。

    请不要把这点建议极端化,为此而跟别人争论不休。明智点的作法应该是不断发展补充自己的观点,使其完善。

    10.方便读者 - Guy Kawasaki 说要通过教导 RSS
    使用方法和建立E-MAIL列表等方便懒人的方法让你的读者们与你保持同步。当然,要注意还有其他细节处,比如简化用户评论流程,提供简明的目录导航,添
    加到网摘的按钮等等。简单地说,就是以user friendly的理念来经营你的Blog。

    国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

    《银河系列原创教程》发布

    《Java Web开发速学宝典》出版,欢迎定购

    Android学习_android镜像

    常用手机分辨率:

    • QVGA        (240×320, low density, small screen)
    • WQVGA     (240×400, low density, normal screen)
    • FWQVGA   (240×432, low density, normal screen)
    • HVGA         (320×480, medium density, normal screen)
    • WVGA800   (480×800, high density, normal screen)
    • WVGA854   (480×854 high density, normal screen)

    developer.android.com镜像:

    2010-05-24

    http://androidappdocs.appspot.com/index.html

    J2ME大观

    http://www.j2medev.cn/forumdisplay.php fid=6

    1.5-SDK:

    http://www.android123.com.cn/sdkxiazai/289.html

    http://code.google.com/android/download.html

    1.6SDK:

    http://androidappdocs.appspot.com/index.html

    学习资料

    http://stdio.cn/2009/05/share_android_docs.htm

    下载ADT

    https://dl-ssl.google.com/android/eclipse/

    引用

    The resource system brings a number of different pieces together to form the final complete resource functionality. To help understand the overall system, here are some brief definitions of the core concepts and components you will encounter in using it:

    Asset: A single blob of data associated with an application. This includes object files compiled from the Java source code, graphics (such as PNG images), XML files, etc. These files are organized in a directory hierarchy that, during final packaging of the application, is bundled together into a single ZIP file.

    aapt: Android Asset Packaging Tool. The tool that generates the final ZIP file of application assets. In addition to collecting raw assets together, it also parses resource definitions into binary asset data.

    Resource Table: A special asset that aapt generates for you, describing all of the resources contained in an application/package. This file is accessed for you by the Resources class; it is not touched directly by applications.

    Resource: An entry in the Resource Table describing a single named value. Broadly, there are two types of resources: primitives and bags.

    Resource Identifier: In the Resource Table all resources are identified by a unique integer number. In source code (resource descriptions, XML files, Java source code) you can use symbolic names that stand as constants for the actual resource identifier integer.

    Primitive Resource: All primitive resources can be written as a simple string, using formatting to describe a variety of primitive types included in the resource system: integers, colors, strings, references to other resources, etc. Complex resources, such as bitmaps and XML describes, are stored as a primitive string resource whose value is the path of the underlying Asset holding its actual data.

    Bag Resource: A special kind of resource entry that, instead of a simple string, holds an arbitrary list of name/value pairs. Each name is itself a resource identifier, and each value can hold the same kinds of string formatted data as a normal resource. Bags also support inheritance: a bag can inherit the values from another bag, selectively replacing or extending them to generate its own contents.

    Kind: The resource kind is a way to organize resource identifiers for various purposes. For example, drawable resources are used to instantiate Drawable objects, so their data is a primitive resource containing either a color constant or string path to a bitmap or XML asset. Other common resource kinds are string (localized string primitives), color (color primitives), layout (a string path to an XML asset describing a view layout), and style (a bag resource describing user interface attributes). There is also a standard “attr” resource kind, which defines the resource identifiers to be used for naming bag items and XML attributes

    Style: The name of the resource kind containing bags that are used to supply a set of user interface attributes. For example, a TextView class may be given a style resource that defines its text size, color, and alignment. In a layout XML file, you associate a style with a bag using the “style” attribute, whose value is the name of the style resource.

    Style Class: Specifies a related set of attribute resources. This data is not placed in the resource table itself, but used to generate constants in the source code that make it easier for you to retrieve values out of a style resource and/or XML tag’s attributes. For example, the Android platform defines a “View” style class that contains all of the standard view attributes: padding, visibility, background, etc.; when View is inflated it uses this style class to retrieve those values from the XML file (at which point style and theme information is applied as approriate) and load them into its instance.

    Configuration: For any particular resource identifier, there may be multiple different available values depending on the current configuration. The configuration includes the locale (language and country), screen orientation, screen density, etc. The current configuration is used to select which resource values are in effect when the resource table is loaded.

    Theme: A standard style resource that supplies global attribute values for a particular context. For example, when writing an Activity the application developer can select a standard theme to use, such as the Theme.White or Theme.Black styles; this style supplies information such as the screen background image/color, default text color, button style, text editor style, text size, etc. When inflating a layout resource, most values for widgets (the text color, selector, background) if not explicitly set will come from the current theme; style and attribute values supplied in the layout can also assign their value from explicitly named values in the theme attributes if desired.

    Overlay: A resource table that does not define a new set of resources, but instead replaces the values of resources that are in another resource table. Like a configuration, this is applied at load time to the resource data; it can add new configuration values (for example strings in a new locale), replace existing values (for example change the standard white background image to a “Hello Kitty” background image), and modify resource bags (for example change the font size of the Theme.White style to have an 18 pt font size). This is the facility that allows the user to select between different global appearances of their device, or download files with new appearances.

    android图片压缩的完整的解决方案

         对与andorid图片的压缩,小伙伴们的可能都是用的bitmap.compress()方法,一般也没啥问题.开始我也是用的这个方法,这2天客户反映,压缩以后图片不够清楚,仔细去看,还真是,同一张图andorid和ios压出来的效果差距好大,这是为什么呢,经过不断的百度谷歌,发现原来是谷歌挖了一个坑,这个坑是什么呢,下面就开始我们的蛋疼之路.

         首先简单介绍一下一般的安卓图片压缩,第一步计算图片的压缩比

    /**
    	 * 计算图片的缩放值
    	 * 
    	 * @param options
    	 * @param reqWidth
    	 * @param reqHeight
    	 * @return
    	 */
    	public static int calculateInSampleSize(BitmapFactory.Options options,
    			int reqWidth, int reqHeight) {
    		// Raw height and width of image
    		final int height = options.outHeight;
    		final int width = options.outWidth;
    		int inSampleSize = 1;
    
    		if (height > reqHeight || width > reqWidth) {
    
    			// Calculate ratios of height and width to requested height and
    			// width
    			final int heightRatio = Math.round((float) height
    					/ (float) reqHeight);
    			final int widthRatio = Math.round((float) width / (float) reqWidth);
    
    			// Choose the smallest ratio as inSampleSize value, this will
    			// guarantee
    			// a final image with both dimensions larger than or equal to the
    			// requested height and width.
    			inSampleSize = heightRatio < widthRatio   heightRatio : widthRatio;
    		}
    
    		return inSampleSize;
    	}
    
    
    

    2,第2步获取到压缩的bitmap

    /**
    	 * 根据路径获的图片并压缩返回bitmap用于显示
    	 * 
    	 * @param imagesrc
    	 * @return
    	 */
    	public static Bitmap getSmallBitmap(String filePath) {
    		final BitmapFactory.Options options = new BitmapFactory.Options();
    		options.inJustDecodeBounds = true;
    		BitmapFactory.decodeFile(filePath, options);
    
    		// Calculate inSampleSize
    		options.inSampleSize = calculateInSampleSize(options, 640, 960);
    
    		// Decode bitmap with inSampleSize set
    		options.inJustDecodeBounds = false;
    		Bitmap localBitmap1 = BitmapFactory.decodeFile(filePath, options);
    		int j = readPictureDegree(filePath);
    		Bitmap localBitmap2 = null;
    		// 旋转图片
    		if ((localBitmap1 != null) && (j != 0)) {
    			localBitmap2 = rotaingImageView(j, localBitmap1);
    			localBitmap1.recycle();
    			localBitmap1 = null;
    			return localBitmap2;
    		}
    
    		return localBitmap1;
    	}
    

        上面的640,和960  可以自己定义合适的大小到这一步你已经取到了等比例缩小的图片了,接下来主要把图片的质量压到100,200k就ok了

    bm.compress(Bitmap.CompressFormat.JPEG, 60, baos);

        经过compress方法  其实我们已经完成了对图片的压缩.那么那个坑到底在哪里呢  答案是libjpeg.那么libjpeg是什么 请看下面这段(ps纯引用)

    libjpeg是广泛使用的开源JPEG图像库(参考 http://en.wikipedia.org/wiki/Libjpeg ),安卓也依赖libjpeg来压缩图片。。

        libjpeg在压缩图像时,有一个参数叫optimize_coding,关于这个参数,libjpeg.doc有如下解释:

    boolean optimize_coding

        TRUE causes the compressor to compute optimal Huffman coding tables

        for the image.  This requires an extra pass over the data and

        therefore costs a good deal of space and time.  The default is

        FALSE, which tells the compressor to use the supplied or default

        Huffman tables.  In most cases optimal tables save only a few percent

        of file size compared to the default tables.  Note that when this is

        TRUE, you need not supply Huffman tables at all, and any you do

        supply will be overwritten.

        这段话大概的意思就是如果设置optimize_coding为TRUE,将会使得压缩图像过程中基于图像数据计算哈弗曼表(关于图片压缩中的哈弗曼表,请自行查阅相关资料),由于这个计算会显著消耗空间和时间,默认值被设置为FALSE。

        这段解释乍看起来没有任何问题,libjpeg的代码也经受了十多年的考验,健壮而高效。但很多人忽略了这一点,那就是,这段解释是十多年前写的,对于当 时的计算设备来说,空间和时间的消耗可能是显著的,但到今天,这似乎不应再是问题,相反,我们应该更多的考虑图片的品质(越来越好的显示技术)和图片的大 小(越来越依赖于云服务)。

        谷歌的Skia项目工程师们最终没有设置这个参数,optimize_coding在Skia中默认的等于了FALSE,这就意味着更差的图片质量和更大的图片文件,而压缩图片过程中所耗费的时间和空间其实反而是可以忽略不计的。那么,这个参数的影响究竟会有多大呢?

        经我们实测,使用相同的原始图片,分别设置optimize_coding=TRUE和FALSE进行压缩,想达到接近的图片质量(用Photoshop 放大到像素级逐块对比),FALSE时的图片大小大约是TRUE时的5-10倍。换句话说,如果我们想在FALSE和TRUE时压缩成相同大小的JPEG 图片,FALSE的品质将大大逊色于TRUE的(虽然品质很难量化,但我们不妨说成是差5-10倍)。

        我们又对Android和iOS进行了对比(均使用标准的JPEG压缩方法),两个系统都没有提供设置optimize_coding的接口(通过阅读源 码,我们已经知道Android是FALSE,iOS不详),当压缩相同的原始图片时,结果也是一样,iOS完胜。想要品质接近,文件大小就会差出 5-10倍,而如果要压缩出相同大小的文件,Android的压缩品质简直就是惨不忍睹。

        结果说明,苹果很清楚optimize_coding参数和哈弗曼表的意义,这里需要特别指出,苹果使用的哈弗曼表算法与libjpeg(及我们后来自行 采用的libjpeg-turbo)不同,像素级可以看出区别,苹果似乎基于libjpeg又进行了进一步的优化,压缩出来的图片细节上更柔和、更平滑。

        看了上面的一大段,小伙伴们应该已经明白了为什么压缩的质量不行,那要这么解决呢,

    我们直接替换libjpeg库!库文件请见附件(ps:这个c库其实是从github大神那边下载的https://github.com/bither/bither-android-lib),用法就是把2个库文件放到libs文件的下armeabi文件夹下,没有就新建一下 配合一个工具类NativeUtil.

        最后祝小伙伴们少跳,多运动 !

     

    iphone-common-codes-ccteam源代码CCDelete.h

    //  
    //  CCDelete.h  
    //  CCFC  
    //  
    //  Created by xichen on 11-12-17.  
    //  Copyright 2011年 ccteam. All rights reserved.  
    //  
      
    #import <Foundation/Foundation.h>  
      
    #define    RELEASE(obj)    [obj release]  
      
    #define    SAFE_RELEASE(obj)    \  
            {        \  
                RELEASE(obj);        \  
                (obj) = nil;        \  
            }  
      
      
    @interface CCDelete : NSObject   
    {  
          
    }  
      
    @end  

    googlecode链接地址(会有更新):http://code.google.com/p/iphone-common-codes-ccteam/source/browse/trunk/CCFC/files/CCDelete.h

    android菜单

    android提供了三种菜单类型,分别为options menu,context menu,sub menu。

    options menu就是通过按home键来显示,context menu需要在view上按上2s后显示。这两种menu都有可以加入子菜单,子菜单中不能嵌套子菜单。

    options menu最多只能在屏幕最下面显示6个菜单选项,成为icon menu,icon menu不能有checkable选项。多余6的会以more icon menu来调出,成为expanded menu。options menu通过activity的onCreateOptionsMenu来生成,这个函数只会在menu第一次生成时调用。任何想改变options menu的想法只能在onPrepareOptionsMenu来实现,这个函数会在menu显示前调用。onOptionsItemSelected 处理选中的菜单项。

    context menu是跟某个具体的view绑定在一起,在activity种用registerForContextMenu来为某个view注册context menu。context menu在显示前都会调用onCreateContextMenu来生成menu。onContextItemSelected选中的菜单项。

    android还提供了对菜单项进行分组的功能,可以把相似功能的菜单项分成同一个组,这样就可以通过调用setGroupCheckable,setGroupEnabled,setGroupVisible来设置菜单属性,而无须单独设置。

    在Android(OPhone)模拟器中加载和使用SDCard卡

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
    <meta name=”ProgId” content=”Word.Document”>
    <meta name=”Generator” content=”Microsoft Word 11″>
    <meta name=”Originator” content=”Microsoft Word 11″>
    <link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”>
    <!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><!–[if !mso]>
    <style>
    st1″:*{behavior:url(#ieooui) }
    </style>
    <![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style>
    <!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>

    本文为原创,如需转载,请注明作者和出处,谢谢!


    Android
    模拟器或真机都会有一定大小的内部存储空间(不是指内存,指的是持久化存储空间),但这并不够,有时我们需要更大的存储空间。为了在模拟器上开发使用扩展存储空间的程序,需要在PC上模拟一个SDCard的虚拟文件,然后加载到模拟器中。sdcard文件使用tools目录下的mksdcard.exe命令生成,假设要生成大小256Msdcard文件,可以使用如下的命令:

    <!–<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    –>mksdcardlmycard256Mcard/mycard.img

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″><meta name=”ProgId” content=”Word.Document”><meta name=”Generator” content=”Microsoft Word 11″><meta name=”Originator” content=”Microsoft Word 11″><link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”><!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><!–[if !mso]>
    <style>
    st1″:*{behavior:url(#ieooui) }
    </style>
    <![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style><!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>

    使用mksdcard命令要注意如下六点:

    1.mycard命令可以使用三种尺寸:字节、KM。如果只使用数字,表示字节。后面还可以跟K,如262144K,也表示256M

    2.mycard建立的虚拟文件最小为8M,也就是说,模拟器只支持大于8M的虚拟文件。

    3.-l命令行参数表示虚拟磁盘的卷标,可以没有该参数。

    4.虚拟文件的扩展名可以是任意的,如mycard.abc

    5.mksdcard命令不会自动建立不存在的目录,因此,在执行上面命令之前,要先在当前目录中建立一个card目录。

    6.mksdcard命令是按实际大小生成的sdcard虚拟文件。也就是说,生成256M的虚拟文件的尺寸就是256M,如果生成较大的虚拟文件,要看看自己的硬盘空间够不够哦!

    在执行完上面的命令后,执行下面的命令启动android模拟器:

    <!–<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    –>emulatoravdavd1sdcardcard\mycard.img

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″><meta name=”ProgId” content=”Word.Document”><meta name=”Generator” content=”Microsoft Word 11″><meta name=”Originator” content=”Microsoft Word 11″><link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”><!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style><!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>如果在开发环境(Eclipse)中,可以在Run Configuration对话框中设置启动参数,如图1所示。

    图1

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″><meta name=”ProgId” content=”Word.Document”><meta name=”Generator” content=”Microsoft Word 11″><meta name=”Originator” content=”Microsoft Word 11″><link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”><!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style><!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>

    当然,也可以在Preferences对话框中设置默认启动参数。如图2所示。这样在新建立的Android工程中就自动加入了装载sdcard虚拟文件的命令行参数。

    图2

    如果读者使用OPhone虚拟机,设置的方法是完全一样的。然后在虚拟机中的Setting里看看sdcard,是否找到,如图2所示。

    图3

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
    <meta name=”ProgId” content=”Word.Document”>
    <meta name=”Generator” content=”Microsoft Word 11″>
    <meta name=”Originator” content=”Microsoft Word 11″>
    <link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”>
    <!–[if gte mso 9]><xml>
    <w:WordDocument>
    <w:View>Normal</w:View>
    <w:Zoom>0</w:Zoom>
    <w:PunctuationKerning/>
    <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
    <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
    <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
    <w:ValidateAgainstSchemas/>
    <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
    <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
    <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
    <w:Compatibility>
    <w:SpaceForUL/>
    <w:BalanceSingleByteDoubleByteWidth/>
    <w:DoNotLeaveBackslashAlone/>
    <w:ULTrailSpace/>
    <w:DoNotExpandShiftReturn/>
    <w:AdjustLineHeightInTable/>
    <w:BreakWrappedTables/>
    <w:SnapToGridInCell/>
    <w:WrapTextWithPunct/>
    <w:UseAsianBreakRules/>
    <w:DontGrowAutofit/>
    <w:UseFELayout/>
    </w:Compatibility>
    <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
    </w:WordDocument>
    </xml><![endif]–><!–[if gte mso 9]><xml>
    <w:LatentStyles deflockedstate=”false” latentstylecount=”156″>
    </w:LatentStyles>
    </xml><![endif]–><style>
    <!– /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;
    mso-font-alt:SimSun;
    mso-font-charset:134;
    mso-generic-font-family:auto;
    mso-font-pitch:variable;
    mso-font-signature:3 135135232 16 0 262145 0;}
    &#64;font-face
    {font-family:”\&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;
    mso-font-charset:134;
    mso-generic-font-family:auto;
    mso-font-pitch:variable;
    mso-font-signature:3 135135232 16 0 262145 0;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    mso-pagination:none;
    font-size:10.5pt;
    mso-bidi-font-size:12.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:宋体;
    mso-font-kerning:1.0pt;}
    /* Page Definitions */
    &#64;page
    {mso-page-border-surround-header:no;
    mso-page-border-surround-footer:no;}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;
    mso-header-margin:36.0pt;
    mso-footer-margin:36.0pt;
    mso-paper-source:0;}
    div.Section1
    {page:Section1;}
    –>
    </style>
    <!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {mso-style-name:普通表格;
    mso-tstyle-rowband-size:0;
    mso-tstyle-colband-size:0;
    mso-style-noshow:yes;
    mso-style-parent:””;
    mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
    mso-para-margin:0cm;
    mso-para-margin-bottom:.0001pt;
    mso-pagination:widow-orphan;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;
    mso-ansi-language:#0400;
    mso-fareast-language:#0400;
    mso-bidi-language:#0400;}
    </style>
    <![endif]–>

    那么如何查看sdcard虚拟设备中的内容呢?方法很多,最简单的就是使用android
    eclipse
    插件带的DDMS透视图。如图4所示。

    图4

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
    <meta name=”ProgId” content=”Word.Document”>
    <meta name=”Generator” content=”Microsoft Word 11″>
    <meta name=”Originator” content=”Microsoft Word 11″>
    <link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”>
    <!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style>
    <!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>

    右上角的几个按钮可以删除、添加文件。

    如果不使用DDMS插件,或不在eclipse里工作,也可以使用其他工具来操作sdcard虚拟设备。如在windows下,可以使用mtools,该软件可以从如下地址下载:

    http://files.cnblogs.com/nokiaguy/winima81.rar

    安装完后,用mtools打开mycard.img,就会看到相应的目录和文件。如图5所示。

    图5

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
    <meta name=”ProgId” content=”Word.Document”>
    <meta name=”Generator” content=”Microsoft Word 11″>
    <meta name=”Originator” content=”Microsoft Word 11″>
    <link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”>
    <!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style>
    <!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>

    如果读者使用的是linux,可以使用mount命令来将sdcard虚拟文件映射成linux的目录。先使用下面的命令:

    <!–<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    –>mountoloopmycard.img/mnt/card

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″><meta name=”ProgId” content=”Word.Document”><meta name=”Generator” content=”Microsoft Word 11″><meta name=”Originator” content=”Microsoft Word 11″><link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”><!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style><!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>

    执行上面的命令后,将会输出如下的错误:

    <!–<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    –>mount::youmustspecifythefilesystemtype

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″><meta name=”ProgId” content=”Word.Document”><meta name=”Generator” content=”Microsoft Word 11″><meta name=”Originator” content=”Microsoft Word 11″><link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”><!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style><!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>

    出现上面错误的原因是由于img文件的开头包含了mbr,以致于mount命令无法识别,当然,如果跳过这个就可以了。我们可以执行下面的命令看看应该跳过多少个字节:

    <!–<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    –>fdiskulmycard.img

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″><meta name=”ProgId” content=”Word.Document”><meta name=”Generator” content=”Microsoft Word 11″><meta name=”Originator” content=”Microsoft Word 11″><link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”><!–[if gte mso 9]><xml>
    <w:WordDocument>
    <w:View>Normal</w:View>
    <w:Zoom>0</w:Zoom>
    <w:PunctuationKerning/>
    <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
    <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
    <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
    <w:ValidateAgainstSchemas/>
    <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
    <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
    <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
    <w:Compatibility>
    <w:SpaceForUL/>
    <w:BalanceSingleByteDoubleByteWidth/>
    <w:DoNotLeaveBackslashAlone/>
    <w:ULTrailSpace/>
    <w:DoNotExpandShiftReturn/>
    <w:AdjustLineHeightInTable/>
    <w:BreakWrappedTables/>
    <w:SnapToGridInCell/>
    <w:WrapTextWithPunct/>
    <w:UseAsianBreakRules/>
    <w:DontGrowAutofit/>
    <w:UseFELayout/>
    </w:Compatibility>
    <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
    </w:WordDocument>
    </xml><![endif]–><!–[if gte mso 9]><xml>
    <w:LatentStyles deflockedstate=”false” latentstylecount=”156″>
    </w:LatentStyles>
    </xml><![endif]–><style>
    <!– /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;
    mso-font-alt:SimSun;
    mso-font-charset:134;
    mso-generic-font-family:auto;
    mso-font-pitch:variable;
    mso-font-signature:3 135135232 16 0 262145 0;}
    &#64;font-face
    {font-family:”\&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;
    mso-font-charset:134;
    mso-generic-font-family:auto;
    mso-font-pitch:variable;
    mso-font-signature:3 135135232 16 0 262145 0;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    mso-pagination:none;
    font-size:10.5pt;
    mso-bidi-font-size:12.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:宋体;
    mso-font-kerning:1.0pt;}
    /* Page Definitions */
    &#64;page
    {mso-page-border-surround-header:no;
    mso-page-border-surround-footer:no;}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;
    mso-header-margin:36.0pt;
    mso-footer-margin:36.0pt;
    mso-paper-source:0;}
    div.Section1
    {page:Section1;}
    –>
    </style><!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {mso-style-name:普通表格;
    mso-tstyle-rowband-size:0;
    mso-tstyle-colband-size:0;
    mso-style-noshow:yes;
    mso-style-parent:””;
    mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
    mso-para-margin:0cm;
    mso-para-margin-bottom:.0001pt;
    mso-pagination:widow-orphan;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;
    mso-ansi-language:#0400;
    mso-fareast-language:#0400;
    mso-bidi-language:#0400;}
    </style>
    <![endif]–> 输出的内容见图6

    图6

    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
    <meta name=”ProgId” content=”Word.Document”>
    <meta name=”Generator” content=”Microsoft Word 11″>
    <meta name=”Originator” content=”Microsoft Word 11″>
    <link rel=”File-List” href=”file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml”>
    <!–[if gte mso 9]><xml>
    Normal
    0
    7.8 磅
    0
    2
    false
    false
    false
    MicrosoftInternetExplorer4
    </xml><![endif]–><!–[if gte mso 9]><![endif]–><style>
    <!–
    /* Font Definitions */
    &#64;font-face
    {font-family:宋体;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    &#64;font-face
    {font-family:””&#64;宋体”;
    panose-1:2 1 6 0 3 1 1 1 1 1;}
    /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
    {mso-style-parent:””;
    margin:0cm;
    margin-bottom:.0001pt;
    text-align:justify;
    text-justify:inter-ideograph;
    font-size:10.5pt;
    font-family:”Times New Roman”;}
    /* Page Definitions */
    &#64;page
    {}
    &#64;page Section1
    {size:612.0pt 792.0pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
    div.Section1
    {page:Section1;}
    –>
    </style>
    <!–[if gte mso 10]>
    <style>
    /* Style Definitions */
    table.MsoNormalTable
    {
    mso-style-parent:””;
    font-size:10.0pt;
    font-family:”Times New Roman”;
    mso-fareast-font-family:”Times New Roman”;}
    </style>
    <![endif]–>

    找到一个start的值,本例是129,然后找到Units的值,是512

    512 * 129 = 66048
    Ok
    ,就用下面的命令:

    <!–<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    –>mountoloop,offset=66048mycard.img/mnt/card

    执行完上面的命令后,进入/mnt/card目录,就会看到mycard.img中的文件了。

    如果想在android虚拟机中访问sdcard中的文件,首先要获得sdcard的路径。代码如下:

    <!–<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    –>java.io.FilesdcardDir=android.os.Environment.getExternalStorageDirectory();

    sdcard的目录一般为“/sdcard”

    国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

    《银河系列原创教程》发布

    《Java Web开发速学宝典》出版,欢迎定购

    win7使用msysgit下载android源码(最新地址为:https://android.googlesource.com/)

    msysgit下载地址:http://msysgit.googlecode.com/files/msysGit-fullinstall-1.7.3.1-preview20101002.exe

    msysgit是 Git 版本控制系统在 Windows 下的版本

    下载完WINDOWS版本后,就点击安装,默认是安装在C盘Program Files,我安装是在D:\msysgit\msysgit下

    最好在此目录下新建文件夹,比如我建的是Android SRC 目录下面再建立了packages目录和frameworks目录,

    因为我暂时需要这些源码,大家可以根据自己的不同选择好需要下载的源码,Android源码目录在:https://android.googlesource.com/可以对应这些目录下载开源项目。

    具体操作:

    1.进入新建的目录,比如我的是D:\msysgit\msysgit\Android SRC\frameworks

    然后右键选择Git Bash进入命令工作状态


    2.在命令行输入:git clone https://android.googlesource.com/platform/frameworks/support

    就能下载supprot这个开源项目


    
    

    3.有时候https不能用,那就使用http:

     


    4.windows下不提供批量下载,所以只能一个个项目下载,大家可以写一个bat文件,将所有下载地址放进去,

    然后进行批量下载

    这个就是最新的Android源码下载方式,之前网上说的什么

    git clone git://android.git.kernel.org/XX项目老是不行,不知道是不是因为这个是对应的Linux版本,或者其他,

    反正我是没有下载成功的。后面在国外论坛上发现https://android.googlesource.com/上有开源项目,所以我就

    试着操作,结果就是这样了。

    下载过程仅作参考使用,高手绕道。