[转载]Android GPS 定位的实现(1)

mikel阅读(968)

[转载]Android GPS 定位的实现(1) – 彬彬的博客 – 博客园.

今天弄了一个多小时,写了一个GPS获取地理位置代码的小例子,包括参考了网上的一些代码,并且对代码进行了一些修改,希望对大家的帮助。具体代码如下:  要实用Adnroid平台的GPS设备,首先需要添加上权限,所以需要添加如下权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

具体实现代码如下:

首先判断GPS模块是否存在或者是开启:

代码

private void openGPSSettings() { LocationManager alm = (LocationManager) this .getSystemService(Context.LOCATION_SERVICE); if (alm .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT) .show(); return; } Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); startActivityForResult(intent,0); //此为设置完成后返回到获取界面 }

如果开启正常,则会直接进入到显示页面,如果开启不正常,则会进行到GPS设置页面:

获取代码如下:

代码

private void getLocation() { // 获取位置管理服务 LocationManager locationManager; String serviceName = Context.LOCATION_SERVICE; locationManager = (LocationManager) this.getSystemService(serviceName); // 查找到服务信息 Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度 criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗 String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息 Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置 updateToNewLocation(location); // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米 locationManager.requestLocationUpdates(provider, 100 * 1000, 500, locationListener);
}

到这里就可以获取到地理位置信息了,但是还是要显示出来,那么就用下面的方法进行显示:

代码

private void updateToNewLocation(Location location) { TextView tv1; tv1 = (TextView) this.findViewById(R.id.tv1); if (location != null) { double latitude = location.getLatitude(); double longitude= location.getLongitude(); tv1.setText("维度:" + latitude+ "\n经度" + longitude); } else { tv1.setText("无法获取地理信息"); } }

这样子就能获取到当前使用者所在的地理位置了,至少如何下地图上实现,在下面将进行获取,并显示出来!对参考代码的人表示感谢!

[转载]闲语ASP.NET MVC3和Razor

mikel阅读(1280)

[转载]闲语MVC3和Razor – 阿不 – 博客园.

原本没有这篇博客,直到看到ScottGu的这篇文章ASP.NET MVC 3: Razor’s @: and <text> syntax。我才决定,把我这几天对MVC3和Razor的一些观点记录一下。

关于Razor

因 为最近我身边的朋友和博客的博友,似乎对MVC3和Razor没有什么好感,甚至于认为微软开发Razor是走在另一条错误的路上。虽然我也没有在项目中 实际用到Razor,但是一直以来都还是挺关注Razor的进展,对它的语法也是了解一二,总体感觉就是更为干净和流畅了,其它的并没有更深的认识。晚上 在看ScottGu文章的时候,一段代码片段立即吸引了我:

你知道这段代码哪里吸引了我吗?没错,就是C#代码与html结合的非常流畅,(特别是它在花括号的处理上面,真的是让我眼睛一亮,因为目前最讨有花括号的ASPX代码了),相应的ASPX语法是这样的:

ASPX-smaple1

从两个代码片段对应,至少两点非常吸引我:

  1. ASPX 的语法,一句完整的foreach代码片段,被人为的拆分了几个不同的代码段。在书写上,我们可以通过Code Snippet来快速生成foreach代码格式,但是由于ASPX的语法问题,我们需要不断的去移动光标位置来把花括号拆分出来,在中间才放要输出的 HTML代码。在阅读上,我不得不去用第三只眼睛来数<%%>(其实我没有,只能让原本的两只多承担一点)。
  2. 不知道你注意到了没有,属于相同代码块的C#代码都会以高亮的方式显示。而在ASPX代码中,我们一眼是无法很好的区分哪些代码块是相关。

其实从这两代码我已经能够想像到,当我们的代码里面,出现了几层嵌套时的它们各自的场景了。由于ASPX是目前主要(几乎是唯一)的一种模板引擎,我已经几乎习惯,要睁大眼睛去匹配花括号对应关系的情况了,特别是当我们的代码超过一屏时,那真是一种享受啊。

在 读完ScottGu的整篇文章之后,自己做了几个新手实验之后,我大概明白了Razor的大概做法了。Razor在处理C#代码时,从以@开头的代码片段 开始(if..else, for,foreach,或是空语句@{}代码块)等语句,从{开始,到对应的}结束,在这个区域内都是可以写C#代码的区域,我们可以写任何的C#代 码,而不需要再有任何额外的标识,直到我们再次碰到:

  1. @(这时的@是用可以用于输出C#变量或属性值)。
  2. @:用于输出静态字符串。
  3. Html标签会直接输出,Html标签内的区域不属于C#代码区域,不可以写C#代码,里面的文件会直接输出,输出属性需要用@。
  4. text文本块,text文本块也是以html标签的形式存在,但它不是标准的html标签,只是它会被Razor特殊处理,只输出text里面的文本,而它自身的标签并不会被输出。这对于我们需要输出多行文本时可能会非常有用。

这 里,我还想特别说明一点。我不知道大家是否有遇到,在ASPX里面,如果我要给标签的属性绑定C#变量时,我在里面就无法使用代码提示了。我经常都是要到 外头去写好一段代码,然后复制进去。这让我非常痛苦,即使我手工也可以写完那段代码。请原谅我的水平低下,我真的不是那种可以完全用notepad就可以 写程序的程序员。如果你跟我有一样的痛苦的话,Razor将会给你带来惊喜,看看真相如何:

intellisense-tag-attribute

@是Razor的灵魂,所有的语法都是以@开头或结束,@using、@model、@**@、@: 。我目前知道的就这些了,但是不难想象,Razor的一切都会比ASPX来的简单,虽然@**@看着没有比<%– –%>强多少,但也还是比较有个性的 微笑。甚至连Razor文件的图标都是@符号。

至 于模板的性质,Razor本身还是以服务器代码驱动的,而不是限制性的标记性语法。在View当中可以写任何代码,安全性方面确实需要考虑,但是从灵活性 来讲,我相信还是有很多程序员离不开自由模板的,虽然限制性模板也可以达到相同的目的。我一直在想,有没有办法可以单独限制View中的代码的访问权限, 类似于trust level,只是这个trust level是用来限制模板中的代码。

关于MVC3

关于 MVC3,我个人不否认我的跟进态度有点激进,以至于在会影响其它项目的情况下还是升级到MVC3 R2。其实在R1出来的时候,我就尝试过升级,但是由于一个很难绕过的Bug而放弃。原本是没有那么强烈的意愿升级到MVC3 R2,只是周一那天,同事在介绍MVC3的时候,提到的unobtrusive js,突然让我想到,我是否可以利用这个特性来突破我们那天遇到的难题。在那天前的博客当 中,我还专门提到,当时还不大喜欢unobtrusive js的方式,时间刚过一周,我现在是非常的喜欢了unobtrusive js,用起来真的很干净,也很顺手,排错也非常方便。虽然很多人会说unobtrusive js不是微软发明的,但是想说,通过服务器端的ModelMetadata和客户端的unobtrusive js,真的可以让一切都简单很多,而且是不带性能损失并且可以改善架构的简单。

关于MVC,现在已经到第三版本了。作为一位从beta版 就开始跟踪,并用于实际项目开发的开发人员来说,我对MVC的了解,虽然没有像@Jeffery Zhao那么深入,相对来讲,对MVC的整个框架来算是比较熟悉的。我现在也真正体会到,微软的产品(或者是任何一家公司的产品),从第三个版本开始才会 真正成熟好用。虽然我有点同意这种论调,但是不可否认的是,MVC项目走的是一种社区式,开放式的开发路线。ASP.NET Team从一开始就通过大量的CTP,Beta,RC版本的方式来得到社区的的意见,这点真的非常好,也让产品做的更好用。我虽然没有直接做过什么贡献, 但是我还是从这些版本的更迭当时,学到了更多,也学的更快。

MVC1的时候,还是大量的把MVC1当成Json Service,几乎95%的Controller/Action都是返回Json对象,而在涉及视图的代码中,我还习惯性的使用了WebForm的手 法,用户控件,页面基类,服务器控件,几乎无所不用。不过,即使我用当时的MVC框架的方式来完成一个标准Web开发流程,现在看来,也可能是相当可怜。

MVC2 在加入了ModelMetadata之后,让MVC框架更上一层楼了,结合Html.XXXFor,DataAnnotation之后,让我们在表单生 成,数据绑定,数据验证方面更加的顺风顺水。有了ModelMetadata的MVC之后,MVC框架进入了另一个阶段了。微笑

相 对而言,我觉得MVC3,只是在MVC2基础之上,再结合.NET 4的一些“中看”特性而继续完善。但是它需要.NET4的要求,除了dynamic特性,无法在.NET 3.5中使用以外,其它的特性我们当然都可以单独提取一个基本.NET 3.5的MVC3出来。而且,其实不要被骗了,ViewBag真的不是特别常用的,或者说不是特别好用。

关于MVC3,最后我还想说,我真的很喜欢。关于Razor,我很期待。

[转载]AderTemplate模版引擎使用分析(二)

mikel阅读(1241)

[转载]AderTemplate模版引擎使用分析(二) – waemz – 博客园.

Ver2.1还添加了以下操作符:
is – 和调用equal方法相同. Ex: #obj1 is obj2# 会返回if obj1 equal obj2
isnot – 和调用notequal方法相同. Ex: #obj1 isnot obj2#
and – 相当于C#中的&&操作符
or – 相当于C#中的||
lt, lte, gt, gte – lt(less than,即c#中的”<“), lte(less than or equal,即c#中的”<=”), gt(greater than 即c#中的”>”) and gte(greater than or equal,c#中的”>=”). 当使用数字类型操作时,必须是相同的类型.如果希望比较double和int类型,必须将int转换为double类型(使用cdouble函数).

#varOne lt 3#
#varTwo lte cdbl(3)#
#varThree gt varFour and varFive gte 5.0#

Built In Tags(内置标签???):
IF
你可以使用IF根据表达式有条件的输出文本:

<ad:if test=”#booleanexpression#”>

<ad:elseif test=”#bool#”>

<ad:else>

</ad:if>

elseif和else是可选的,当if运算返回真的时候,if代码块中包含的代码将被执行(输出);否则执行elseif运算,然后是else.
Ex:

<ad:if test=”#cust.country is “CHINA“#”>
You are CHINA customer.
<ad:else>
You are from: #cust.country# country.
</ad:if>

如果cust.country是CHINA的话,输出:you are CHINA customer.

FOREACH
你可以使用foreach对集合内的元素进行循环遍历.

<ad:foreach collection=”#collection#” var=”cust” index=”i”>
#i#: #cust.lastname#, #cust.firstname#
</ad:foreach>

假设customers是customer的集合:customers = Customer(“Tom”, “Jackson”), Customer(“Mary”, “Foo”)
输出将是:
1. Jackson, Tom
2. Foo, Mary
在循环处理中,变量名称将被集合中的元素替换.foreach中的index属性可以省略,它被用来在循环中表示循环标志.开始于1并在每次迭代中自动增加.

FOR
你可以通过一个整数标志来进行FOR循环:

<ad:for from=”1″ to=”10″ index=”i”>
#i#: #customers[i].name#
</ad:for>

SET
Set标签允许设值通过其他表达式:
<ad:set name=”var” value=”#someexpression#” />
当Set语句执行后,你可以象使用局部变量一样使用var.当存取复杂类型的对象的时候非常有用.
以下写法:

#customers[i].address.firstname#
#customers[i].address.lastname#
#customers[i].address.address1#

可以写成:

<ad:set name=”add” value=”#customers[i].address#” />
#add.firstname#
#add.lastname#
#add.address1#

Custom Templates(定制模版):
你可以在模版文件中创建自己可调用的的模版.使用Template标签来做:

<ad:template name=”ShowCustomer”>
#customer.lastname#, #customer.firstname#
</ad:template>

<ad:showcustomer customer=”#cust#” />

你可以为自定义的模版添加任何属性,然后就可以在模版中使用他们.自定义模版也可以使用在它之外定义的任何变量,当调用自定义模版的时候必须在最后加上/或者加关闭标签
Ex:
<ad:showcustomer />
OR
<ad:showcustomer></ad:showcustomer>

Ex:

<ad:template name=”bold”>
<b>#innerText#</b>
</ad:template>

<ad:bold>#cust.lastname#, #cust.firstname#</ad:bold>

输出: <b>Jackson, Tom</b> (if customer is Tom Jackson)
模版可以嵌套使用:

<ad:template name=”italic”>#innerText#</ad:template>

<ad:bold><ad:italic>This will be bold and italic</ad:italic></ad:bold>

模版可以嵌套定义:

<ad:template name=”doit”>
<ad:template name=”colorme”>
<font color=#color#>#innerText#</font>
</ad:template>

<ad:colorme color=”blue”>colorize me</ad:colorme>
</ad:template>

嵌套定义的模版只能在按照定义顺序在父模版中使用.
也可以在程序中定义模版:

TemplateManager mngr = ;
mngr.AddTemplate(Template.FromString(
bold, <b>#innerText#</b>));

现在bold模版可以在以后使用了.

(未完,等续)

AderTemplate官方网站:http://www.adersoftware.com
AderTemplate dll下载地址:http://www.aspxon.com/ShowSoft/15.aspx
AderTemplate源码下载地址(含有演示):AderTemplate(dll)模版引擎(c#源码)

[转载]AderTemplate模版引擎使用分析

mikel阅读(1109)

[转载]AderTemplate模版引擎使用分析 – waemz – 博客园.

AderTemplate只能运行于.NET2.0之上.
这里有一个简单例子:

Thank You for your order #order.billFirstName# #order.billLastName#.
<br>
Your Order Total is: #format(order.total, “C”)#
<br>
<ad:if test=”#order.shipcountry isnot “US”#”>
Your order will arrive in 2-3 weeks
<ad:else>
Your order will arrive in 5-7 days
</ad:if>

模版文件可以含有表达式,if/elseif/else语句,foreach/for/set语句和其他模版文件.

Templates API:在模版引擎中有两个主要的类:
Template和TemplateManager.
Template含有一个简单的模版文件实例,TemplateManager被用来处理模版.

创建模版对象Template实例的方法是通过Template或者TemplateManager的静态方法:

Template template = Template.FromString(string name, string data)
Template template
= Template.FromFile(string name, string filename)

然后可以用它来实例化TemplateManager:

TemplateManager mngr = new TemplateManager(template);

或者可以这么做:

TemplateManager mngr = TemplateManager.FromFile(filename);
TemplateManager mngr
= TemplateManager.FromString(template);

使用FromString方法,参数string template可以包含模版代码.这个方法可以在没有模版文件的情况下,从动态生成的文本创建TemplateManager.

可以使用SetValue(string name, object value);来处理模版文件中的标签.
Ex:

mngr.SetValue(customer, new Customer(Tom, Jackson));

这样就可以在模版中使用customer标签,你可以使用任何类型的对象来替换标签,当变量的值被output的时候,ToString()方法会被调用.

– Expressions 表达式(标签,应该这么理解把)
在模版文件中标签是以#包起来的字符串:
#FirstName#

这个例子会输出first name的值.如果要输出#,只要连写两个#即可.
Ex:
Your SS## is #ssnumber#

使用标签你可以输出任何变量(对象):
#somevar#
输出对象的一个属性或字段:
#somestring.Length#
属性名称不区分大小写,所以你可以:#string.length# or #string.LENGTH#
或者调用一个函数:#trim(somename)#
#customer.firstname.length#
你可以调用任何对象的方法:
#firstname.substring(0, 5)# 或者 #customer.isValid()#

Ver2.1允许你调用指定下标的Array项:
#somearray[3]# – 得到Array的第三项
#hastable[“somekey”]# – 得到somekey的值从hashtable.

有一些现成的函数和很方便就能添加的函数,这些函数是:
equals(obj1, obj2) – 检查obj1和obj2是否相等,返回boolean真假
notequals(obj1, obj2) – 返回!equals(obj1, obj2). 相当于调用: not(equals(obj1, obj2))
iseven(num) – tests whether number is an even number
isodd(num) – tests whether number is an odd number
isempty(string) – 测试字符串是否为空. 和equals(string.Length, 0)相同
isnotempty(string) – 测试字符串是否含有至少1个字符
isnumber(num) – 测试num是否为数字格式
toupper(string) – 不说了
tolower(string) – 不说了
isdefined(varname) –  测试varname是否被定义
ifdefined(varname, value) – 如果varname被定义,那么返回value的值.例如:#ifdefined(“name”, name)# -如果name被定义的话,返回name的值,否则返回nothing.
len(string) – 返回字符串的长度.
tolist(collection, property, delim) -以delim为分隔符,把collection转化为字符串.prototype是collection的某个属性,如果prototype不为空,将返回以delim分隔的该属性的值.如果没有prototype,collection将被使用.
Ex:
假设list如下:

ArrayList list = new ArrayList();
list.Add(
one);
list.Add(
two);
list.Add(
three);
template.SetValue(
mylist, list);

那可以在模版中这样写:#toList(mylist, ” & “)#
最后的输出将是:one & two & three

假设list如下:

list.Add(new Customer(Tom, Whatever));
list.Add(
new Customer(Henry, III));
list.Add(
new Customer(Tom, Jackson));
template.SetValue(
mylist, list);

在模版中:#toList(mylist, “firstName”, “,”)#
最后的输出将是:Tom,Henry,Tom

isnull(obj) – 测试对象是否为null
not(boolvalue) – -_-不说了
iif(booleanExpression, iftruevalue, iffalsevalue) – 和C#中的三元表达式一样: booleanExpression ? iftruevalue : iffalsevalue
Ex:
#iif(isodd(i), “bgcolor=yellow”, “bgcolor=red”)#
will output bgcolor=yellow if i is odd number and bgcolor=red if i is not odd number

format(object, formatstring) – 将会调用object的ToString(formatstring).
Ex:
(如果total是货币型1208.45)
#format(total, “C”)#
会输出: $1,208.45
trim(string) – 略
filter(collection, booleanproperty) – will return new List from collection for those objects whose booleanproperty property evaluates to true

gt(obj1, obj2) – 如果obj1>obj2返回true.obj1和obj2必须继承于相同的类型.
lt(obj1, obj2) – 如果obj1<obj2返回true.obj1和obj2必须继承于相同的类型.
compare(obj1, obj2) – 如果obj1<obj2,返回-1;如果obj1==obj2,返回0,如果obj1>obj2返回1.obj1和obj2必须继承于相同的类型.
or(bool1, bool2) – 如果bool1为真或bool2为真,返回真
ex:
#or(equals(state, “IL”), equals(state, “NY”))# – 如果state==”IL”或者state==”NY”返回真
and(bool1, bool2) – 不罗嗦了
comparenocase(string1, string2) – will do case insenstive comparison of string1 and string2 and return true if they are equal
stripnewlines(string) – 在string后换行
typeof(object) – Ex: typeof(“hello”) return “string”. typeof(3) returns int
cint(value) – 调用Convert.ToInt32 from .net library
cdouble(value) – 转换为double类型
cdate(value) – 转换为datetime类型.Ex: #cdate(“2005-5-1”)#
createtypereference(type) – Ex:

#createtypereference(“System.Math”).Round(3.39789)#
#createtypereference(“System.Math”).PI#
or
<ad:set name=”MyMath” value=”#createtypereference(“System.Math”)#” />
#MyMath.Round(3.3)#
#MyMath.PI#

(未完,等续)

AderTemplate官方网站:http://www.adersoftware.com
AderTemplate dll下载地址:http://www.aspxon.com/ShowSoft/15.aspx
AderTemplate源码下载地址(含有演示):AderTemplate(dll)模版引擎(c#源码)

[转载]9款最具代表性的 jQuery 幻灯片效果

mikel阅读(1002)

[转载](转)9款最具代表性的 jQuery 幻灯片效果 – 豪情 – 博客园.

原文来自:http://www.sunflowamedia.com/blog/index.php/web-design-blog/9-jquery-slides/

使用JQuery的幻灯片效果变得非常受欢迎,我整理出比较具有代表性的几款分享给大家,有些还提供功能下载,让我们一起来看看吧。

1. Nivo

Nivo
http://nivo.dev7studios.com/

2. Slidesjs

Slidesjs
http://www.slidesjs.com/

3. Hevoq

Hevoq
http://www.davidmassiani.com/horinaja/index.php

4. jqfancytransitions

jqfancytransitions
http://www.zurb.com/playground/orbit-jquery-image-slider

5. Orbit

Orbit
http://www.zurb.com/playground/orbit-jquery-image-slider

6. Animate Panning

Animate Panning
http://buildinternet.com/2010/02/animate-panning-slideshow-with-jquery/

7. quicksand

quicksand
http://razorjack.net/quicksand/

8. viewbook

viewbook
http://builtbywill.com/code/viewbook/

9. Slide Deck

Slide Deck
http://www.slidedeck.com/?utm_source=Themeflash&utm_medium=banner&utm_campaign=SlideDeck%2BDisplay

[转载]C#反射调用方法-InvokeMember

mikel阅读(1426)

[转载]反射发送实战-InvokeMember – chinafine – 博客园.

[转载]通过javascript获得url参数

mikel阅读(1007)

[转载]通过javascript获得url参数 – 永远的梦魇 – 博客园.

页面提交数据一般有两种方法:get,post。post就是所谓的form提交,使用视图;get是通过url提交。

Get方法一般用后台代码(如asp,ASP.NET)获得参数,代码很简单:Request.QueryString[“id”];即可获取。

有些时候需要直接在前台获取url参数,要用到JavaScript,js没有直接获取url参数的方法,那么,我们如何通过js获取url参数呢?

function GetUrlParms()
{
var args=new Object();
var query=location.search.substring(1);//获取查询串
var pairs=query.split(“&”);//在逗号处断开
for(var   i=0;i
<pairs.length;i++)
{
var pos
=pairs[i].indexOf(‘=’);//查找name=value
if(pos==-1) continue;//如果没有找到就跳过
var argname
=pairs[i].substring(0,pos);//提取name
var value=pairs[i].substring(pos+1);//提取value
args[argname]=unescape(value);//存为属性
}
return args;
}

使用方法:
var args = new Object();
args = GetUrlParms();
如果要查找参数key:
value = args[key]

[转载]Android 简单的照相机程序

mikel阅读(959)

[转载]Android 简单的照相机程序 – 彬彬的博客 – 博客园.

终于经过多次找错,修改把一个简单的照相机程序完成了,照相类代码如下:

代码

1 class surface extends SurfaceView implements SurfaceHolder.Callback { 2 3 SurfaceHolder sfholder; 4 5 Camera camera; 6 7 Bitmap bitmap; 8 9 public surface(Context context) { 10 super(context); 11 // TODO Auto-generated constructor stub 12   13 sfholder = getHolder(); 14 sfholder.addCallback(this); 15 sfholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 16 } 17 18 public void surfaceChanged(SurfaceHolder holder, int format, int width, 19 int height) { 20 // TODO Auto-generated method stub 21   Camera.Parameters parameters = camera.getParameters(); 22 parameters.setPictureFormat(PixelFormat.JPEG); 23 parameters.setPreviewSize(320, 480); 24 parameters.setPictureSize(320, 480); 25 camera.setParameters(parameters); 26 camera.startPreview(); 27 } 28 29 public void surfaceCreated(SurfaceHolder holder) { 30 // TODO Auto-generated method stub 31   32 try { 33 camera = Camera.open(); 34 camera.setPreviewDisplay(sfholder); 35 } catch (Exception e) { 36 camera.release(); 37 camera = null; 38 } 39 } 40 41 public void surfaceDestroyed(SurfaceHolder holder) { 42 // TODO Auto-generated method stub 43   camera.stopPreview(); 44 camera = null; 45 46 } 47 //拍照 48 public void takePicture() 49 { 50 if (camera != null) 51 { 52 camera.takePicture(null, null, jpegCallback); 53 } 54 } 55 56 //拍照并且保存的回调函数 57   58 private PictureCallback jpegCallback = new PictureCallback() { 59 60 public void onPictureTaken(byte[] data, Camera camera) { 61 // TODO Auto-generated method stub 62 try 63 { 64 bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 65 File file = new File("/sdcard/camera1.jpg"); 66 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); 67 bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos); 68 bos.flush(); 69 bos.close(); 70 Canvas canvas= sfholder.lockCanvas(); 71 canvas.drawBitmap(bitmap, 0,0, null); 72 sfholder.unlockCanvasAndPost(canvas); 73 } 74 catch(Exception e) 75 { 76 e.printStackTrace(); 77 } 78 } 79 } 80 }

这个是一个拍照的类,使用的是SurfaceView来实现的,如果想要在一部分上显示,并且使用按钮操作的话,可以修改一下这个类,而且这个是拍照之后停留在拍照页面的,如果需要在拍照后不停留在拍照页面的,可以自行修改和添加参数。

此程序也演示了,如何在拍完照之后,将照片保存到SD卡上。

实际使用时的操作如何,使用的是按键进行拍照的,其实也可以改为使用按钮进行拍照的,只要对这个类进行简单的修改即可。调用如下:

代码

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) sf.takePicture(); return super.onKeyDown(keyCode, event); }

要使用相机和操作SD卡,则需要添加以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.CAMERA"></uses-permission>

第一条是可以使用扩展存储设备的权限

第二条是可以使用照相机设备

如果没有这两条权限的话,会报错,具体错误可以在DDMS中查看 。欢迎交流!

希望对大家有所帮助 !

此平台使用提Android2.2 V8的系统,如果使用1.5或者是其它的,权限可能会不一样!

当然更好的方法是首先检查SD卡是否存在,此程序中没有进行检测,因为我只是在练习相机的使用。

检测代码如下:

代码

if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { File sdcardPath = Environment.getExternalStorageDirectory(); setTitle(sdcardPath.getName()); //将SD卡路径名字设置为标题,只是为了让大家看的更明白些 } else { Toast.makeText(RecordTest.this, "没有SD卡", 1000).show(); }

[转载]详解主流浏览器多个外部JavaScript请求和执行机制

mikel阅读(1113)

[转载]详解主流浏览器多个外部JS请求和执行机制 – Simon4545的IT生活 – 博客园.

在IE8,Firefox3.6之前页面加载外部的JavaScript文件(IE6,7会连同图片,样式资源和页面渲染一同阻塞)是阻塞式的,而 在之后的版本中,浏览器都使用了瀑布式加载,这样页面的打开及渲染速度都会变快,请注意,我提到的瀑布式加载,仅仅指的是加载,而非JS的执行,在主流浏 览器中JS的执行总是阻塞的。用简单一点的语言描述,就是同一时间,页面只会加载一个js文件。在第一个js文件加载并执行完之前,第二个要引入的js不 会下载和执行。而页面中js的引入顺序以请求的顺序为定。
我们来看一个IE6下,页面加载多个js文件的例子:
inline script block:为页面内嵌js代码块,而external script则是需要从外部加载进来的js文件。

image我 们设定inline script执行用时3秒,external script1加载用时2秒,执行用时3秒,external script2加载用时2秒,执行用0秒(实际上会稍大于0,下同),external script3加载用2秒,执行用时0秒。
由上图,可知页面需要15641毫秒才能将js加载并执行完。我们可以得到一个公式:

image

而同样的页面,在IE8和Firefox3.6下,我们会得到:
IE8: (只需要9秒,速度快了近一倍)

image

Firefox:

image

由以上的现象,可以证实上面的观点。

那么是否有一个方案可以让IE6/7或是Chrome展示我们的页面更快一点,可以同时加载多个文件,并且不影响页面中DOM元素的渲染?答案是肯定的。

在之前的项目中,我曾经写过类似的代码,来处理请求多个外部JavaScript文件。

function loadScript(url, fn, doc, charset){
doc
= doc || document;
var script = doc.createElement(script);
script.language
= javascript;
script.charset
= charset?charset:’utf8’;
script.type
= text/javascript;

script.onload = script.onreadystatechange = function(){
if (!script.readyState || loaded === script.readyState || complete === script.readyState) {
fn
&& fn();
script.onload
= script.onreadystatechange = null;
script.parentNode.removeChild(script);
};
};
script.src
= url;
$(
head)[0].appendChild(script);
}

那个当网页中需要动态调用多个js文件时,我们可以这样写:

loadScript('../jquery-1.4.2.js',function(){console.log('jquery-1.4.2.js loaded')}); loadScript('$.wbx.js',function(){console.log('example/$.wbx.js loaded')}); loadScript('gadgets.js',function(){console.log('example/gadgets.js loaded')}); loadScript('jui-all.js',function(){console.log('example/jui-all.js loaded')});
 上段代码处理这样的功能:可以动态加载多个js文件,当文件下载完成后可以执行回调函数。当然它的好外不止于此,我们还可以按需获取,减少流量和浏览器内存占用!对于高并发请求的网站,有着天大的好处!我以前在的一家公司做过统计首页减少50k的流量,一年就可以节省十几万的成本呀。。。但上面的代码也不是完美的,在一些应用下会出现新的问题。请看下面的截图
image

image

不难发现,加载的顺序变了!这时,如果a.js依赖于b.js,而b.js偏偏又迟于a.js加载完成时,就会出现“变量未定义”的js错误,无法执行下去。

那我们的下一个目标就是如何让这些外部文件有序的加载进网页。这样无论智商高的还是低的,都会想到 队列 ,不错,就是队列。在JS里实现队列并不难办,是的,数组就行,我们可以用数组的shift方法,弹出数组的第一个JS文件(这也是我们最先加入数组的那 个JS文件),模拟了队列的实现方法。不过,在这里我们还要多考虑一个问题:必须要上一个js文件加载完成后,下一个JS的请求才能开始。我们怎么判断上 一个JS文件已经加载完成了呢?上代码:

var testNode = doc.createElement(script), fn, node;
fn
= testNode.readyState ? function(node, callback){
node.onreadystatechange
= function(){
var rs = node.readyState;
if (rs === loaded || rs === complete) {
// handle memory leak in IE
node.onreadystatechange = null;
callback.call(
this);
}
};
}:
function(node, callback){
node.onload
= callback;
};

在非IE情况下我们可以很方便的用dom元素的onload和onerror来判断元素是否已经加载完成,而IE不吃这套,它并不支持script 节点的onload判断,所以我们只好寻求其它的解决方案。还好,IE对onreadystatechange和readyState的支持足以让我们完 成这个任务。

readyState 的值  可能为 以下几个 :

“uninitialized” – 原始状态
“loading” – 下载数据中..
“loaded” – 下载完成
“interactive” – 还未执行完毕.
“complete” – 脚本执行完毕.

在IE6/7/8下,虽然script节点加载完成,但结果并不总是loaded或是complete,并且先设置src再append到节点树和 先append到节点树再设定src,IE7/8处理加载src文件的时间是不同的。为了减少不必要的麻烦,我们这里就两个状态都判断了。

接下来还有一个问题,如果其中某个js文件,需要去处理dom节点,而我们在加载js时并不能确定这个节点是否已经渲染完成,既我们的Js加载需要在所有的dom节点渲染完成后才开始加载执行,这时我们就要用到经典的domReady判断。

代码

function domReady(){
if (readyBound) {
return;
}

readyBound = true;

if (document.readyState === complete) {
return dequeue();
}

if (document.addEventListener) {
document.addEventListener(
DOMContentLoaded, dequeue, false);
window.addEventListener(
load, dequeue, false);
}
else
if (document.attachEvent) {
document.attachEvent(
onreadystatechange, dequeue);

window.attachEvent(onload, dequeue);
var toplevel = false;
try {
toplevel
= window.frameElement == null;
}
catch (e) {
}

if (document.documentElement.doScroll && toplevel) {
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll(left);
}
catch (error) {
setTimeout(arguments.callee,
10);
return;
}
dequeue();
}
}
}

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas,”Courier New”,courier,monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); }早期的做法是用window.onload或是defer,defer并不是所有的浏览器都支持,可以排除。 window.onload事件是待到页面上的所有资源被加载才激活,如果页面上有许多图片或音乐,而我们要操作的元素在的它们的下方呢?因此,W3C搞 了DOMContentLoaded与addEventListener,只是可惜IE又不支持。还好,我们又找到readystatechange。知 道页面的内容加载完成,我们再用到Diego Perini提供的doScroll来判断document节点是否渲染到页面。这样我们就能够让js在页面渲染完成后再执行了。至些我们就实现了以下的 功能:

  1. 异步加载,加快了页面的加载时间,同时能够按需加载,节省流量
  2. 有序加载,解决js依赖问题
  3. 延时执行,在页面渲染完成后再执行js,防止undefined情况
附上最后实现的代码:/Files/simon4545/nc.loader.rar

[转载].Net 之匿名对象(AnonymousObject)

mikel阅读(994)

[转载].Net 之匿名对象(AnonymousObject) – RyanDing – 博客园.

前言:最近园子里面大谈程序员基础知识的文章,基础知识的重要性无需多论了。看到大家对基础知识的评论后突然想到这么一个场景。曾经有个同事问我:有一个 匿名对象想做为一个函数的返回值,可以么?我当时坚定的回答—不可以。而他也深信不疑,似乎真的实现不了。如果我没记错的话当时是.NET3.5环 境,如果当时是.NET4.0的话我就大错特错了。

开始切入主题,我对.NET 匿名对象的认识如下:

一、.NET3.5时代开始引入匿名对象概念


.NET3.0 时,微软加入了匿名对象到.net 中。JavaScript 程序员对匿名对象并不陌生。但是对于当时的.NET程序员而言,应该属于一个新鲜事物。.NET4.0可以让我们实例化对象而不需要为该对象定义类。如何理解“实例化对象而不需要为该对象定义类”,还是用代码来解释吧:

1 private static Object GetAnonymousObj()
2 {
3 Object anonymousObj = new { UserName = "admin", Password = "1111" };
4 return anonymousObj;
5 }

这里并未在实例化对象前为anonymousObj对象建立相关的类,所以称anonymousObj对象为匿名对象。


二、.NET 4.0中将匿名对象作为函数返回值


回到本文开头引入的前言部分– 匿名对象可以作为函数返回值么?在.NET4.0中这个已经成为现实。

请看一下代码范例,将匿名对象作为返回值:

1 private static Object GetAnonymousObj()
2 {
3 Object anonymousObj = new { UserName = "admin", Password = "1111" };
4 return anonymousObj;
5 }

很简单的一段代码,让我们将anonymousObj这个匿名对象作为了函数返回值。但是在调用该函数时发现了问题,我们没法这样做:

Object obj = GetAnonymousObj();

Console.WriteLine(obj.UserName); // 这里将无法编译。因为obj对象是Object类型。

因此在.net3.5时,我告诉同事这个还是不要这样实现的好。换个方法吧?当.NET4.0时代来临时,我们的问题得到妥善的解决 —- 首先由Dynamic 类型隆重登场:(Dynamic简单介绍

先将上文中的GetAnonymousObj函数改造成返回dynamic 类型:

1 private static dynamic GetAnonymousObj()
2 {
3 dynamic anonymousObj = new { UserName = "admin", Password = "1111" };
4 return anonymousObj;
5 }

接着调用GetAnonymousObj()方法:

1 static void Main(string[] args)
2 {
3 dynamic o = GetAnonymousObj();
4 Console.WriteLine(o.UserName);
5 Console.ReadKey();
6 }

输出>>admin.

匿名对象也许在您的项目中运用的并不是很多,但我的项目大部分是建立在LinqToSQL的基础上,所以我们常常会写出这样的代码:在LINQ查询语句中使用匿名对象。比如:

1 var user = from user in Users
2 select new { user.Name, user.Id} //匿名对象


三、.NET中匿名对象的其他注意事项


  • 匿名对象继承于System.Object。
  • 匿名对象属性均为只读属性(ReadOnly)。
  • 在同一个程序集内,两个匿名对象具有相同的属性、相同的属性顺序。编译器将认为这两个匿名对象是相同的。

最后希望本篇文章可以给您带来帮助,如有不足之处欢迎指出,谢谢!