Ibatis sqlmap.xml中#与$语句的区别

#property# 代表xxx是属性值,map里面的key或者是你的pojo对象里面的属性,ibatis会自动在它的外面加上引号,表现在sql语句是这样的 where xxx = ‘xxx’ ;

$dynamicSQL$ 则是把xxx作为字符串拼接到你的sql语句中, 比如 order by topicId , 语句这样写 … order by #xxx#,ibatis 就会把他翻译成 order by ‘topicId’ (这样就会报错) 语句这样写 … order by $xxx$ibatis 就会把他翻译成 order by topicId

Vi中将指定中的数值进行替换

vi编辑器是Linux常用的文件编辑器,有时候需要对指定行进行查找和替换,基本步骤如下:

假如文件为a.txt

vi a.txt

进入编辑模式,输入set nu

查找指定行,例如(5到10行)

进行替换操作(比如以;开头替换为#)

5,10s/^;/#/g

输入命令后按Enter键回车即可执行替换操作。

Javascript setCapture方法

setCapture 方法,用于容器对象,效果是对指定的对象设置鼠标捕捉。 所谓鼠标捕捉,是指对鼠标事件(onmousedown,onmouseup,onmousemove,onclick,ondbclick , onmouseover,onmouseout)进行捕捉,使在容器内的对象的鼠标事件均由容器对象触发,因此只能在容器对象的鼠标事件函数中进行处理。当这个函数为true时,对鼠标进行捕捉,相反不捕捉。

与这个函数对应,releaseCapture方法释放鼠标捕获,并触发onlosecapture事件。

 

focus方法,将输入的焦点设置在指定的对象上。

人与人之间的差距,是从大学开始拉大的。。

1、一个年轻人,如果在这四年的时间里,没有任何想法,他这一生,就基本这个样子,没有多大改变了。 ­

2、成功者就是胆识加魄力,曾经在火车上听人谈起过温州人的成功,说了这么三个字,“胆子大”。这其实,就是胆识,而拿得起,放得下,就是魄力。 ­

3、这个世界,有这么一小撮的人,打开报纸,是他们的消息,打开电视,是他们的消息,街头巷尾,议论的是他们的消息,仿佛世界是为他们准备的,他们能够呼风唤雨,无所不能。你的目标,应该是努力成为这一小撮人。 ­

4、如果,你真的爱你的爸妈,爱你的女朋友,就好好的去奋斗,去拼搏吧,这样,你才有能力,有经济条件,有自由时间,去陪他们,去好好爱他们。 ­

5、这个社会,是快鱼吃慢鱼,而不是慢鱼吃快鱼。 ­

6、这个社会,是赢家通吃,输者一无所有,社会,永远都是只以成败论英雄。 ­

7、如果你问周围朋友词语,如果十个人,九个人说不知道,那么,这是一个机遇,如果十个人,就个人都知道了,就是一个行业。 ­

8、任何一个行业,一个市场,都是先来的有肉吃,后来的汤都没的喝。 ­

9、这个世界上,一流的人才,可以把三流项目做成二流或更好,但是,三流人才,会把一流项目,做的还不如三流。 ­

10、趁着年轻,多出去走走看看。读万卷书,不如行万里路,行万里路,不如阅人无数。 ­

11、与人交往的时候,多听少说。这就是,上帝为什么给我们一个嘴巴两个耳朵的原因。 ­

12、记得,要做最后出牌的人,出让别人觉得出其不意的牌,在他们以为你要输掉的时候,这样,你才能赢得牌局。 ­

13、不要装大,对于装大的人,最好的办法就是,捡块砖头,悄悄跟上去,一下子从背后放倒他。 ­

14、不要随便说脏话,这会让别人觉得你没涵养,不大愿意和你交往。即使交往,也是敷衍。因为他内心认定你素质很差。 ­

15、心情不好就抽根烟,想想这事有必要让自己郁闷吗? ­

16、买衣服的时候,要自己去挑,不要让家人给你买,虽然你第一第二次买的都不怎么样,可是,你会慢慢有眼光的。 ­

17、要想进步,就只有吸取教训,成功的经验都是歪曲的,成功了,想怎么说都可以,失败者没有发言权,可是,你可以通过他的事例反思,总结。教训,不仅要从自己身上吸取,还要从别人身上吸取。 ­

18、学习,学习,再学习,有事没事,去书店 看看书,关于管理,金融,营销,人际交往,未来趋势等这些,你能获得很多。这个社会竞争太激烈了,你不学习,就会被淘汰。中国2008底,有一百多万大学 生找不到工作。竞争这么激烈,所以,一定要认识一点,大学毕业了,不是学习结束了,而是学习刚刚开始。还有,我个人推荐一个很好的视频节目,《谁来一起午 餐》。 ­

19、如果你不是歌手,不是画家,也不是玩行为艺术的,那么,请在平时注意你的衣着。现在这个社会,衣着能表现出你属于哪一个群体,哪一个圈子。 ­

20、记住,平均每天看电视超过三个小时以上的,一定都是那些月收入不超过两千元的,如果你想要月收入超过两千,请不要把时间浪费在电视上。同样的道理,那些平均每天玩网络游戏或聊天超过三个小时以上的,也都是那些月收入不超过两千的。 ­

21、因为穷人很多,并且穷人没有钱,所以,他们才会在网络上聊天抱怨,消磨时间。你有见过哪个企业老总或主管经理有事没事经常在QQ群里闲聊的? ­

22、无论你以后是不是从事销售部门,都看一下关于营销的书籍。因为,生活中,你处处都是在向别人推销展示你自己。 ­

23、平时的时候,多和你的朋友沟通交流一下,不要等到需要朋友的帮助时,才想到要和他们联系,到了社会,你才会知道,能够认识一个真正的朋友,有多难? ­

24、如果你想知道自己将来的年收入如何。找你最经常来往的六个朋友,把他们的年收入加起来,除以六,就差不多是你的了。这个例子,可以充分的说明一点,物以类聚。 ­

25、不要听信身边人的话,大一不谈恋爱,好的男孩就被别人都挑走了。想想,刚上大一就耐不住寂寞,受不住诱惑,而去谈恋爱的男孩子,值得自己去珍惜吗?大学里,可以有一场爱情,可是,不要固执地认为,大学期间就必须要谈恋爱! ­

26、大学里不是一定要经历恋爱的,除了恋爱,还应该有其他更值得自己去做的事情,比如,去参加一些兼职或校内代理一些东西,去图书馆多看一些书,可以的话,去组织并领导一个团队,做点有意义的事情。 ­

27、关于爱情,有这么一句话,没有面包,怎么跳舞?无论什么时候,你决定去好好爱一个人的时候,一定要考虑给她你能给予的最好的物质生活。 ­

28、给自己定一个五年的目标,然后,把它分解成一年一年,半年半年的,三个月的,一个月的。这样,你才能找到自己的目标和方向。 ­

29、无论什么时候,记住尊严这两个字。做人,要有尊严,有原则,有底线的。否则,没有人会尊重你。 ­

30、如果,我只能送你一句忠告,那就是,这个世界上没有免费的午餐,永远不要走捷径。 ­

没有主导权,就没有话语权

生活就像是一种永不停歇的运动,周而复始,如果始终只是围绕这一个圆心不断旋转,跳不出这个循环,改变无从谈起。没有主导,就没有话语。寻求改变的机会,就是要把握出发展的主线,跳出这个怪圈,真正实现自主寻求突破,不在拘泥于繁琐些事,努力实践,努力突破。去达到更高层次,其实不同的地方,不同的方位都有独特的风景线,主导自己人生,感受绚丽多彩的世界。

CSS3 box-shadow阴影效果详细说明

先来看box-shadow的浏览器兼容性,Opera已经支持box-shadow属性。firefox通过私有属性-moz-box-shadow支持。Safari和Chrome通过私有属性-webkit-box-shadow支持。
box-shadow有六个可设值:
img{box-shadow:阴影类型 X轴位移 Y轴位移 阴影大小 阴影扩展 阴影颜色 }
阴影水平偏移量:如果该参数为正值,则阴影在box的右边;如果该参数为负,则阴影在box的左边
阴影垂直偏移量:如果该参数为正值,则阴影在box的底部;反之,则在box顶部
阴影模糊距离(大小):此参数可选,只能是正值。如果该参数值为,则阴影的边缘犀利;该值越大,阴影的边缘越模糊
阴影扩展距离:此参数可选。如果该参数为正,则整个阴影都延展扩大;反之,则缩小。
阴影颜色:此参数可选。如果不写,则会选取默认颜色。至于默认颜色会是什么,不清楚(在webkit核心下为无色,即透明),建议不要省略该值。
阴影类型:此参数可选。有唯一值‘inset’,如果存在该值,那么阴影将为内阴影;如果不写该值,则为缺省的外阴影。
box-shadow的特征:通过对阴影偏移量的设置,可以使得阴影出现在“上、右、下、左”任一方向;阴影大小、边缘模糊、颜色可自定义;可设置内阴影及外阴影;可设置“多组”阴影。
下面是个小例子
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset=”utf-” />
<style>
body {
width:px;
margin:px auto;
}
.box {
position:relative;
-webkit-box-shadow:px px px rgba(, , , );
-moz-box-shadow:px px px rgba(, , , );
box-shadow:px px px rgba(, , , );
padding:px;
background:#fff;
}
.box img {
width:%;
border:px solid #a;
border-style:inset;
}
.box:after {
content:”;
position:absolute;
z-index:-;
/* box-shadow  */
-webkit-box-shadow: px px rgba(, , , );
-moz-box-shadow: px px rgba(, , , );
box-shadow: px px rgba(, , , );
width:%;
left:%;
height:px;
bottom:;
}
</style>
</head>
<body>
<div class=”box”>
<img src=”text.jpg” title=”蛇年邮票” />
</div>
</body>
</html>
转载于http://www.cnblogs.com/lefan/archive/2013/01/09/2853696.html

Android模仿书本翻页效果原理

来源:AigeStudio http://blog.csdn.net/aigestudio

有了前面两节的基础呢其实曲线的实现可以变得非常简单,为什么这么说呢?因为曲线无非就是在折线的基础上对Path加入了曲线的实现,进而只是影响了我们的Region区域,而其他的什么事件啊、滑动计算啊之类的几乎都是不变的对吧,说白了就是对现有的折线View进行update改造,虽然是改造,但是我们该如何下手呢?首先我们来看看现实中翻页的效果应该是怎样的呢?如果大家身边有书或本子甚至一张纸也行,尝试以不同的方式去翻动它,你会发现除了我们前面两节曾提到过的一些限制外,还有一些special的现象:

一、翻起来的区域从侧面来看是一个有弧度的区域,如图所示侧面图:

而我们将按照第一节中的约定忽略这部分弧度的表现,因为从正俯视的角度我们压根看不到弧度的效果,So~我们强制让其与页面平行:

二、根据拖拽点距离页面高度的不同,我们可以得到不同的卷曲度:

而其在我们正俯视点的表现则是曲线的弧度不同:

同样的,我们按照第一节的约定,为了简化问题,我们将拖拽点距离页面的高度视为一个定值使在我们正俯视点表现的曲线起点从距离控件交点1/4处开始:

三、如上一节末所说,在弯曲的区域图像也会有相似的扭曲效果

OK,大致的一个分析就是这样,我们根据分析结果可以得出下面的一个分析图:

由上图配合我们上面的分析我们可知:DB = 1/4OB,FA = 1/4OA,而点F和点D分别为两条曲线(如无特殊声明,我们所说的曲线均为贝赛尔曲线,下同)的起点(当然你也可以说是终点无所谓),这时,我们以点A、B为曲线的控制点并以其为端点分别沿着x轴和y轴方向作线段AG、BC,另AG = AF、BC = BD,并令点G、C分别为曲线的终点,这样,我们的这两条二阶贝塞尔曲线就非常非常的特殊,例如上图中的曲线DC,它是由起始点D、C和控制点B构成,而BD = BC,也就是说三角形BDC是的等腰三角形,进一步地说就是曲线DC的两条控制杆力臂相等,进一步地我们可以推断出曲线DC的顶点J必定在直线DC的中垂线上,更进一步地我们可以根据《自定义控件其实很简单5/12》所说的二阶贝塞尔曲线公式得出当且仅当t = 0.5时曲线的端点刚好会在顶点J上,由此我们可以非常非常简单地得到曲线的顶点坐标。好了,YY归YY我们还是要回归到具体的操作中来,首先,我们要计算出点G、F、D、C的坐标值,这四点坐标也相当easy,就拿F点坐标来说,我们过点F分别作OM、AM的垂线:

因为FA = 1/4OA,那么我们可以得到F点的x坐标Fx = a + 3/4MA,y坐标Fy = b + 3/4OM,而G点的x坐标Gx = a + MA – 1/4x;其他两点D、C就不多扯了,那么在代码中如何体现呢?首先,为了便于观察效果,我们先注释掉图片的绘制:

/*
 * 如果坐标点在原点(即还没发生触碰时)则绘制第一页
 */
if (mPointX == 0 && mPointY == 0) {
	// canvas.drawBitmap(mBitmaps.get(mBitmaps.size() - 1), 0, 0, null);
	return;
}

// 省略大量代码

//drawBitmaps(canvas);

并绘制线条:

canvas.drawPath(mPath, mPaint);

在上一节中我们在生成Path时将情况分为了两种:

if (sizeLong > mViewHeight) {
	//…………………………
} else {
	//…………………………
}

同样,我们也分开处理两种情况,那么针对sizeLong > mViewHeight的时候此时控件顶部的曲线效果已经是看不到了,我们只需考虑底部的曲线效果:

// 计算曲线起点
float startXBtm = btmX2 - CURVATURE * sizeShort;
float startYBtm = mViewHeight;

// 计算曲线终点
float endXBtm = mPointX + (1 - CURVATURE) * (tempAM);
float endYBtm = mPointY + (1 - CURVATURE) * mL;

// 计算曲线控制点
float controlXBtm = btmX2;
float controlYBtm = mViewHeight;

// 计算曲线顶点
float bezierPeakXBtm = 0.25F * startXBtm + 0.5F * controlXBtm + 0.25F * endXBtm;
float bezierPeakYBtm = 0.25F * startYBtm + 0.5F * controlYBtm + 0.25F * endYBtm;

/*
 * 生成带曲线的四边形路径
 */
mPath.moveTo(startXBtm, startYBtm);
mPath.quadTo(controlXBtm, controlYBtm, endXBtm, endYBtm);
mPath.lineTo(mPointX, mPointY);
mPath.lineTo(topX1, 0);
mPath.lineTo(topX2, 0);
mPath.lineTo(bezierPeakXBtm, bezierPeakYBtm);

该部分的实际效果如下:

PS:为了便于大家对参数的理解,我对每一个点的坐标都重新给予了一个引用其命名也浅显易懂,实际过程可以省略这一步简化代码

而当sizeLong <= mViewHeight时这时候不但底部有曲线效果,右侧也有:

/*
 * 计算参数
 */
float leftY = mViewHeight - sizeLong;
float btmX = mViewWidth - sizeShort;

// 计算曲线起点
float startXBtm = btmX - CURVATURE * sizeShort;
float startYBtm = mViewHeight;
float startXLeft = mViewWidth;
float startYLeft = leftY - CURVATURE * sizeLong;

/*
 * 限制左侧曲线起点
 */
if (startYLeft <= 0) {
	startYLeft = 0;
}

/*
 * 限制右侧曲线起点
 */
if (startXBtm <= 0) {
	startXBtm = 0;
}

// 计算曲线终点
float endXBtm = mPointX + (1 - CURVATURE) * (tempAM);
float endYBtm = mPointY + (1 - CURVATURE) * mL;
float endXLeft = mPointX + (1 - CURVATURE) * mK;
float endYLeft = mPointY - (1 - CURVATURE) * (sizeLong - mL);

// 计算曲线控制点
float controlXBtm = btmX;
float controlYBtm = mViewHeight;
float controlXLeft = mViewWidth;
float controlYLeft = leftY;

// 计算曲线顶点
float bezierPeakXBtm = 0.25F * startXBtm + 0.5F * controlXBtm + 0.25F * endXBtm;
float bezierPeakYBtm = 0.25F * startYBtm + 0.5F * controlYBtm + 0.25F * endYBtm;
float bezierPeakXLeft = 0.25F * startXLeft + 0.5F * controlXLeft + 0.25F * endXLeft;
float bezierPeakYLeft = 0.25F * startYLeft + 0.5F * controlYLeft + 0.25F * endYLeft;

/*
 * 生成带曲线的三角形路径
 */
mPath.moveTo(startXBtm, startYBtm);
mPath.quadTo(controlXBtm, controlYBtm, endXBtm, endYBtm);
mPath.lineTo(mPointX, mPointY);
mPath.lineTo(endXLeft, endYLeft);
mPath.quadTo(controlXLeft, controlYLeft, startXLeft, startYLeft);

效果如下:

Path有了,我们就该考虑如何将其转换为Region,在这个过程中呢又一个问题,曲线路径不像上一节的直线路径我们可以轻易获得其范围区域,因为我们的折叠区域其实应该是这样的:

如图所示红色路径区域,这部分区域则是我们折叠的区域,而事实上我们为了计算方便将整条二阶贝赛尔曲线都绘制了出来,也就是说我们的Path除了红色线条部分还包含了蓝色线条部分对吧,那么问题来了,如何将这两部分“做掉”呢?其实方法很多,我们可以在计算的时候就只生成半条曲线,这是方法一我们利用纯计算的方式,记得我在该系列文章开头曾说过翻页效果的实现可以有两种方式,一种是纯计算而另一种则是利用图形的组合思想,如何组合呢?这里对于区域的计算我们就不用纯计算的方式了,我们尝试用图形组合来试试。首先我们将Path转为Region看看是什么样的:

Region region = computeRegion(mPath);
canvas.clipRegion(region);
canvas.drawColor(Color.RED);
// canvas.drawPath(mPath, mPaint);

效果如下:

可以看到我们没有封闭的Path形成的Region效果,事实呢跟我们需要的区域差距有点大,首先上下两个月半圆是多余的,其次目测少了一块对吧:

如上图蓝色的那块,那么我们该如何把这块“补”回来呢?利用图形组合的思想,我们设法为该Region补一块矩形:

然后差集掉两个月半圆不就成了?这部分代码改动较大,我先贴代码再说吧:

if (sizeLong > mViewHeight) {
	// 计算……额……按图来AN边~
	float an = sizeLong - mViewHeight;

	// 三角形AMN的MN边
	float largerTrianShortSize = an / (sizeLong - (mViewHeight - mPointY)) * (mViewWidth - mPointX);

	// 三角形AQN的QN边
	float smallTrianShortSize = an / sizeLong * sizeShort;

	/*
	 * 计算参数
	 */
	float topX1 = mViewWidth - largerTrianShortSize;
	float topX2 = mViewWidth - smallTrianShortSize;
	float btmX2 = mViewWidth - sizeShort;

	// 计算曲线起点
	float startXBtm = btmX2 - CURVATURE * sizeShort;
	float startYBtm = mViewHeight;

	// 计算曲线终点
	float endXBtm = mPointX + (1 - CURVATURE) * (tempAM);
	float endYBtm = mPointY + (1 - CURVATURE) * mL;

	// 计算曲线控制点
	float controlXBtm = btmX2;
	float controlYBtm = mViewHeight;

	// 计算曲线顶点
	float bezierPeakXBtm = 0.25F * startXBtm + 0.5F * controlXBtm + 0.25F * endXBtm;
	float bezierPeakYBtm = 0.25F * startYBtm + 0.5F * controlYBtm + 0.25F * endYBtm;

	/*
	 * 生成带曲线的四边形路径
	 */
	mPath.moveTo(startXBtm, startYBtm);
	mPath.quadTo(controlXBtm, controlYBtm, endXBtm, endYBtm);
	mPath.lineTo(mPointX, mPointY);
	mPath.lineTo(topX1, 0);
	mPath.lineTo(topX2, 0);

	/*
	 * 替补区域Path
	 */
	mPathTrap.moveTo(startXBtm, startYBtm);
	mPathTrap.lineTo(topX2, 0);
	mPathTrap.lineTo(bezierPeakXBtm, bezierPeakYBtm);
	mPathTrap.close();

	/*
	 * 底部月半圆Path
	 */
	mPathSemicircleBtm.moveTo(startXBtm, startYBtm);
	mPathSemicircleBtm.quadTo(controlXBtm, controlYBtm, endXBtm, endYBtm);
	mPathSemicircleBtm.close();

	/*
	 * 生成包含折叠和下一页的路径
	 */
	//暂时没用省略掉

	// 计算月半圆区域
	mRegionSemicircle = computeRegion(mPathSemicircleBtm);
} else {
	/*
	 * 计算参数
	 */
	float leftY = mViewHeight - sizeLong;
	float btmX = mViewWidth - sizeShort;

	// 计算曲线起点
	float startXBtm = btmX - CURVATURE * sizeShort;
	float startYBtm = mViewHeight;
	float startXLeft = mViewWidth;
	float startYLeft = leftY - CURVATURE * sizeLong;

	// 计算曲线终点
	float endXBtm = mPointX + (1 - CURVATURE) * (tempAM);
	float endYBtm = mPointY + (1 - CURVATURE) * mL;
	float endXLeft = mPointX + (1 - CURVATURE) * mK;
	float endYLeft = mPointY - (1 - CURVATURE) * (sizeLong - mL);

	// 计算曲线控制点
	float controlXBtm = btmX;
	float controlYBtm = mViewHeight;
	float controlXLeft = mViewWidth;
	float controlYLeft = leftY;

	// 计算曲线顶点
	float bezierPeakXBtm = 0.25F * startXBtm + 0.5F * controlXBtm + 0.25F * endXBtm;
	float bezierPeakYBtm = 0.25F * startYBtm + 0.5F * controlYBtm + 0.25F * endYBtm;
	float bezierPeakXLeft = 0.25F * startXLeft + 0.5F * controlXLeft + 0.25F * endXLeft;
	float bezierPeakYLeft = 0.25F * startYLeft + 0.5F * controlYLeft + 0.25F * endYLeft;

	/*
	 * 限制右侧曲线起点
	 */
	if (startYLeft <= 0) {
		startYLeft = 0;
	}

	/*
	 * 限制底部左侧曲线起点
	 */
	if (startXBtm <= 0) {
		startXBtm = 0;
	}

	/*
	 * 根据底部左侧限制点重新计算贝塞尔曲线顶点坐标
	 */
	float partOfShortLength = CURVATURE * sizeShort;
	if (btmX >= -mValueAdded && btmX <= partOfShortLength - mValueAdded) {
		float f = btmX / partOfShortLength;
		float t = 0.5F * f;

		float bezierPeakTemp = 1 - t;
		float bezierPeakTemp1 = bezierPeakTemp * bezierPeakTemp;
		float bezierPeakTemp2 = 2 * t * bezierPeakTemp;
		float bezierPeakTemp3 = t * t;

		bezierPeakXBtm = bezierPeakTemp1 * startXBtm + bezierPeakTemp2 * controlXBtm + bezierPeakTemp3 * endXBtm;
		bezierPeakYBtm = bezierPeakTemp1 * startYBtm + bezierPeakTemp2 * controlYBtm + bezierPeakTemp3 * endYBtm;
	}

	/*
	 * 根据右侧限制点重新计算贝塞尔曲线顶点坐标
	 */
	float partOfLongLength = CURVATURE * sizeLong;
	if (leftY >= -mValueAdded && leftY <= partOfLongLength - mValueAdded) {
		float f = leftY / partOfLongLength;
		float t = 0.5F * f;

		float bezierPeakTemp = 1 - t;
		float bezierPeakTemp1 = bezierPeakTemp * bezierPeakTemp;
		float bezierPeakTemp2 = 2 * t * bezierPeakTemp;
		float bezierPeakTemp3 = t * t;

		bezierPeakXLeft = bezierPeakTemp1 * startXLeft + bezierPeakTemp2 * controlXLeft + bezierPeakTemp3 * endXLeft;
		bezierPeakYLeft = bezierPeakTemp1 * startYLeft + bezierPeakTemp2 * controlYLeft + bezierPeakTemp3 * endYLeft;
	}

	/*
	 * 替补区域Path
	 */
	mPathTrap.moveTo(startXBtm, startYBtm);
	mPathTrap.lineTo(startXLeft, startYLeft);
	mPathTrap.lineTo(bezierPeakXLeft, bezierPeakYLeft);
	mPathTrap.lineTo(bezierPeakXBtm, bezierPeakYBtm);
	mPathTrap.close();

	/*
	 * 生成带曲线的三角形路径
	 */
	mPath.moveTo(startXBtm, startYBtm);
	mPath.quadTo(controlXBtm, controlYBtm, endXBtm, endYBtm);
	mPath.lineTo(mPointX, mPointY);
	mPath.lineTo(endXLeft, endYLeft);
	mPath.quadTo(controlXLeft, controlYLeft, startXLeft, startYLeft);

	/*
	 * 生成底部月半圆的Path
	 */
	mPathSemicircleBtm.moveTo(startXBtm, startYBtm);
	mPathSemicircleBtm.quadTo(controlXBtm, controlYBtm, endXBtm, endYBtm);
	mPathSemicircleBtm.close();

	/*
	 * 生成右侧月半圆的Path
	 */
	mPathSemicircleLeft.moveTo(endXLeft, endYLeft);
	mPathSemicircleLeft.quadTo(controlXLeft, controlYLeft, startXLeft, startYLeft);
	mPathSemicircleLeft.close();

	/*
	 * 生成包含折叠和下一页的路径
	 */
	//暂时没用省略掉

	/*
	 * 计算底部和右侧两月半圆区域
	 */
	Region regionSemicircleBtm = computeRegion(mPathSemicircleBtm);
	Region regionSemicircleLeft = computeRegion(mPathSemicircleLeft);

	// 合并两月半圆区域
	mRegionSemicircle.op(regionSemicircleBtm, regionSemicircleLeft, Region.Op.UNION);
}

// 根据Path生成的折叠区域
Region regioFlod = computeRegion(mPath);

// 替补区域
Region regionTrap = computeRegion(mPathTrap);

// 令折叠区域与替补区域相加
regioFlod.op(regionTrap, Region.Op.UNION);

// 从相加后的区域中剔除掉月半圆的区域获得最终折叠区域
regioFlod.op(mRegionSemicircle, Region.Op.DIFFERENCE);

/*
 * 根据裁剪区域填充画布
 */
canvas.clipRegion(regioFlod);
canvas.drawColor(Color.RED);

200行的代码我们就做了一件事就是正确计算Path,同样我们还是按照之前的分了两种情况来计算,第一种情况sizeLong > mViewHeight时,我们先计算替补的这块区域:

如上代码46-49行

/*
 * 替补区域Path
 */
mPathTrap.moveTo(startXBtm, startYBtm);
mPathTrap.lineTo(topX2, 0);
mPathTrap.lineTo(bezierPeakXBtm, bezierPeakYBtm);
mPathTrap.close();

然后计算底部的月半圆Path:

对应代码54-56行

/*
 * 底部月半圆Path
 */
mPathSemicircleBtm.moveTo(startXBtm, startYBtm);
mPathSemicircleBtm.quadTo(controlXBtm, controlYBtm, endXBtm, endYBtm);
mPathSemicircleBtm.close();

将当前折叠区域和替补区域相加再减去月半圆Path区域我们就可以得到正确的折叠区域,对应代码64行和192-201行:

// 计算月半圆区域
mRegionSemicircle = computeRegion(mPathSemicircleBtm);

// ………………中间省略巨量代码………………

// 根据Path生成的折叠区域
Region regioFlod = computeRegion(mPath);

// 替补区域
Region regionTrap = computeRegion(mPathTrap);

// 令折叠区域与替补区域相加
regioFlod.op(regionTrap, Region.Op.UNION);

// 从相加后的区域中剔除掉月半圆的区域获得最终折叠区域
regioFlod.op(mRegionSemicircle, Region.Op.DIFFERENCE);

该情况下我们的折叠区域是酱紫的:

两一种情况则稍微复杂些,除了要计算底部,我们还要计算右侧的月半圆Path区域,代码165-174:

/*
 * 生成底部月半圆的Path
 */
mPathSemicircleBtm.moveTo(startXBtm, startYBtm);
mPathSemicircleBtm.quadTo(controlXBtm, controlYBtm, endXBtm, endYBtm);
mPathSemicircleBtm.close();

/*
 * 生成右侧月半圆的Path
 */
mPathSemicircleLeft.moveTo(endXLeft, endYLeft);
mPathSemicircleLeft.quadTo(controlXLeft, controlYLeft, startXLeft, startYLeft);
mPathSemicircleLeft.close();
替补区域的计算,147-151:
/*
 * 替补区域Path
 */
mPathTrap.moveTo(startXBtm, startYBtm);
mPathTrap.lineTo(startXLeft, startYLeft);
mPathTrap.lineTo(bezierPeakXLeft, bezierPeakYLeft);
mPathTrap.lineTo(bezierPeakXBtm, bezierPeakYBtm);
mPathTrap.close();
区域的转换,184-188:
/*
 * 计算底部和右侧两月半圆区域
 */
Region regionSemicircleBtm = computeRegion(mPathSemicircleBtm);
Region regionSemicircleLeft = computeRegion(mPathSemicircleLeft);

// 合并两月半圆区域
mRegionSemicircle.op(regionSemicircleBtm, regionSemicircleLeft, Region.Op.UNION);

最终的计算跟上面第一种情况一样,效果如下:

结合两种情况,我们可以得到下面的效果:

然后,我们需要计算“下一页”的区域,同样,根据上一节我们的讲解,我们先获取折叠区域和下一页区域之和再减去折叠区域就可以得到下一页的区域:

mRegionNext = computeRegion(mPathFoldAndNext);
mRegionNext.op(mRegionFold, Region.Op.DIFFERENCE);

绘制效果如下:

最后,我们结合上两节,注入数据:

/**
 * 绘制位图数据
 * 
 * @param canvas
 *            画布对象
 */
private void drawBitmaps(Canvas canvas) {
	// 绘制位图前重置isLastPage为false
	isLastPage = false;

	// 限制pageIndex的值范围
	mPageIndex = mPageIndex < 0 ? 0 : mPageIndex;
	mPageIndex = mPageIndex > mBitmaps.size() ? mBitmaps.size() : mPageIndex;

	// 计算数据起始位置
	int start = mBitmaps.size() - 2 - mPageIndex;
	int end = mBitmaps.size() - mPageIndex;

	/*
	 * 如果数据起点位置小于0则表示当前已经到了最后一张图片
	 */
	if (start < 0) {
		// 此时设置isLastPage为true
		isLastPage = true;

		// 并显示提示信息
		showToast("This is fucking lastest page");

		// 强制重置起始位置
		start = 0;
		end = 1;
	}

	/*
	 * 计算当前页的区域
	 */
	canvas.save();
	canvas.clipRegion(mRegionCurrent);
	canvas.drawBitmap(mBitmaps.get(end - 1), 0, 0, null);
	canvas.restore();

	/*
	 * 计算折叠页的区域
	 */
	canvas.save();
	canvas.clipRegion(mRegionFold);

	canvas.translate(mPointX, mPointY);

	/*
	 * 根据长短边标识计算折叠区域图像
	 */
	if (mRatio == Ratio.SHORT) {
		canvas.rotate(90 - mDegrees);
		canvas.translate(0, -mViewHeight);
		canvas.scale(-1, 1);
		canvas.translate(-mViewWidth, 0);
	} else {
		canvas.rotate(-(90 - mDegrees));
		canvas.translate(-mViewWidth, 0);
		canvas.scale(1, -1);
		canvas.translate(0, -mViewHeight);
	}

	canvas.drawBitmap(mBitmaps.get(end - 1), 0, 0, null);
	canvas.restore();

	/*
	 * 计算下一页的区域
	 */
	canvas.save();
	canvas.clipRegion(mRegionNext);
	canvas.drawBitmap(mBitmaps.get(start), 0, 0, null);
	canvas.restore();
}

最终效果如下:

该部分的代码就不贴出了,大部分跟上一节相同,因为过两天要去旅游时间略紧这节略讲得粗糙,不过也没什么太大的改动,如果大家有不懂的地方可以留言或群里@哥,下一节我们将尝试实现翻页时图像扭曲的效果。

来源:AigeStudio http://blog.csdn.net/aigestudio

转载经典小笑话

1.某晚,一裸男叫了一辆出租车,女司机目不转睛盯着看他,裸男大怒,吼道:你他妈没见过裸男呀!女司机也大怒:我看你他妈从哪儿掏钱!
2.男女朋友睡一个房间,女的划了条线:过线的是禽兽。醒来发现男的真的没过线 ,女的狠狠打了男的一耳光:你连禽兽都不如!
3.某日刘洪涛遇到外宾,上前搭话曰:I am Hong TaoLiu,外宾曰:我他妈还是方片七呢!
4.仔仔被爸爸修理了,他跑去找妈妈诉苦:“妈妈,有人打你儿子你会怎样?” 妈妈:“我会打他的儿子报仇!” 仔仔:“……”
5.一位老太太不识字,但喜欢听收音机,气象预报每天必听。一天吃饭时问家人:“我有个问题想问问,你们知道局部地区在什么地方?那儿差不多天天有雨。”
6.悬崖上一只小老鼠挥舞着短短的前爪,一次又一次跳下去,努力学习飞翔,旁边母蝙蝠看着它摔的头破血流,忧心的说:它爹,要不告诉它,它不是咱亲生的!
7. 和朋友到泰山顶看日出,一个朋友指着天空说:“我看见了!”“我也看见了!”这时远处有人提着裤子出来骂道:“看见就看见呗!你们嚷什么啊!”
1.幽灵:上帝,我下次投胎想和天使一样全身洁白,并且带着一对翅膀,但我仍然想吸血。
上帝:那你投胎做护舒宝吧。
2.有个朋友第一次勤工俭学在公园里卖冰棍,不好意思吆喝;这时候突然有一人在那里大喊:“卖冰棍儿~~~~卖冰棍儿~~”。那朋友一听,心里可高兴了,就跟着喊:“我也是~~~~我也是~~~~”。
3.蚂蚁和大象结婚不久,大象就死了。蚂蚁一边埋大象,一边痛哭:“亲爱的,你怎么这么早去了,我这辈子不干别的,就埋你了!”
4.一男生暗恋一女生 鼓气勇气问那女生喜欢什么样的男生
“投缘的”女生答 ,连问几遍都是一样的答案
该男生泄气道:“头扁的行不行”。
5.一日,我上气不接下气追赶末班车,一边追一边喊:师傅!师傅等等我呀~
车窗突然有名乘客探出头来,慢条斯理的对着我说:悟空.你就别追了
6.某天考生物,其中有一题是看鸟的腿猜出鸟的名字。某生实在不懂,生气的把卷子一撕准备离开考场。监考老师很生气于是问他:“你是哪班的,叫什么名字?”某生把裤腿一掀,说:“你猜啊你猜啊。”
7.漂亮的蒙古族女演员表演完后,领导上台接见,接着她的手,问寒问暖,半天也不肯放,亲切问道:你叫什么名字?该女演员激动地回答道“玛勒格碧.松首”
8.一个人买了一个只会说俩字谁呀的鹦鹉,有一天主人不在家,有个换煤气的来敲门。
鹦鹉:谁呀。
答:换煤气的
鹦鹉:谁呀。
答:换煤气的
……
主人回家门口躺个人,主人纳闷,这是谁呀
门内:换煤气的
9.一人在路上看到一堆东西,蹲下闻了闻,说可能是便便,用手摸了点放嘴里舔了下,说,还真是便便,还好没踩到!~
10.医生问病人是怎么骨折的,答:我觉得鞋里有沙子,就扶着电线杆抖鞋,我抖啊抖……有个人以为我触电了,便抄起木棒给了我两棒子。
11.某教授在田间授课:“科学研究要不怕脏。。。”然后他蹲下来,用手指戳了一下地上的牛粪,然后把手指放到嘴里舔净.一同学忙说:“我不怕脏。。。”然后也用手指戳了一下地上的牛粪放到嘴里舔净教授:“另外还要善于观察,我刚才是用中指戳粪,但舔的是食指。。。”
12.某公厕内,A君便秘,拉了好久都拉不出来,这时另一男子B君冲进来,刚蹲下就噼里啪啦的拉得好不畅快,A君听到后说:“伙计,真羡慕你呀,拉得这么痛快” B君说:“有啥好羡慕的,裤子还没脱呢……”
13.某君正练习骑自行车,前面来了一个行人,某君惊慌,大叫:”站住!站住!”行人一楞急忙停下。怎奈某君骑术太差还是把行人撞倒。行人起身大怒:”你还叫我站住!你好瞄准是不是!”
14.漂亮妹妹,2岁。一日,偶打电话给她的妈妈,小家伙接的电话。出于礼貌,我也要和她寒暄一下。“乖乖,妈妈呢?”“去花果山了!”“……”“乖乖,那你在做什么呢?”“阿姨你真逗,我不是跟你打电话呢,!”
同事的儿子,4岁。经典的一句话:“我小的时候……”
15.公路上发生了一起车祸——乌龟踩伤了窝牛。警察正在调查事故原因说窝牛:乌龟是怎么撞到你的?正吊着石膏的窝牛惊惶未定地回忆道:我不记得了,当时他的速度太快了!
16.一只北极熊孤单的呆在冰上发呆,实在无聊就开始拔自己的毛玩,一根……两根……三根……最后拔的一根不剩,他突然大叫…………好冷啊!!………………
17.同事的女儿是个小美人胚子,从幼儿园回来她妈妈经常会问她:“美人儿,今天有人这么叫你了吗?”小小女孩子居然叹了口气:“估计他们看我看多了,也就不觉得我美了。”
18.一对夫妇避孕失败后生了一个小男孩,孩子一生出来就紧握拳头,一直笑个不停.护士把他的拳头一掰开.发现里面有一把避孕药,接着小男孩开口说话了:“你们两个想弄死我,没那么容易,哈哈哈哈.........”
19.两个男人去山上玩,一个人不小心失足掉下了山崖,同伴着急的喊:“兄弟,你怎么样,有没有事啊?”,只听到掉下去那个人回答:“我不知道,我还在往下掉呢~~~~~”
20.我也顶,一男子骑自行车,不掌车把,双手抱在胸前,一交警看见后说:手掌好!该男子回答,同志们好!
21. 猴子问狐狸,该怎样用一首歌形容大象放的那个屁?狐狸说:古巨基的<好想好想>蚂蚁听见说:“操,我还以为是动力火车的<当>了。”
22.两兄弟被老虎追,弟弟实在跑不动了,就说:“哥,咱别跑了,和这畜生死嗑吧”哥哥说:“别扯蛋了,我跑不过它,能跑过你就行了。”
23.面条被馒头海扁,找表哥方便面去报仇,方便面看见豆包就一顿暴打,回来后对面条说:放心,我把它屎都打出来了。
24.一时髦女子走上公交车,见一空坐便掏出纸巾猛擦一阵,刚要坐不巧放一屁,旁边一男子笑道:“我KAO,真他妈干净,擦完还要吹吹”
25.企鹅很无聊,于是想到北极去找北极熊玩
走啊走,走了很多年,快到了,突然想起来家里煤气没关好
于是返回,走啊走,又走了很多年,关好煤气,又出发,又走啊走,又走了好多年
好不容易来到了北极熊的门口,敲门:
——北极熊!出来玩!
北极熊:
——不玩。
26.初中,某数学老师讲方程式变换,在讲台上袖子一挽大声喝道:同学们注意!我要变形了!……
27.某法官斜视,一日审判甲乙丙三个犯罪嫌疑人,
法官对甲说:“东西是你偷的吗??”
乙答:“不是”
法官大怒:“我没问你。”
丙道:“我也没说什么呀。”
28.飞机上,乌鸦对空姐说:”给爷来杯水” ,猪听后对空姐说:”给爷也来杯水!” 空姐听后,把乌鸦和猪一起从飞机上扔下来. 乌鸦笑着对猪说:”傻了吧,爷会飞~~~~
29.有只兔子走进一家店里问老板:你们这儿有没有胡萝卜卖?老伴说:没有。过了一会儿兔子又来问:你们这儿有没有胡萝卜卖?老板不耐烦的说没有!过了一会儿兔子又来问了,老板终于忍无可忍:你要是再来捣乱我就拿把剪刀把你的耳朵剪了!
过了一会儿兔子又来了:你们这儿有没有剪刀卖?老板说:没有。兔子又问:你们这儿有没有胡萝卜卖……
30.魔王抓住了公主
魔王说:你尽管叫破喉咙吧,没有人会来救你的!
公主:破喉咙,破喉咙!
没有人:公主,我来救你了!
魔王:说曹操曹操就到!
曹操:魔王,你叫我干嘛?
魔王:哇呀,看到鬼了!
鬼:靠!被发现了.
靠:胡说,谁发现我了?
谁:关我屁事!
魔王:oh,my god!
上帝:谁叫我?!
谁:没有人叫你啊!
没有人:我哪有!!!
据说魔王从此得了精神分裂症.
31.一个国王要替公主征婚,把一个苹果放在公主头上,谁要把它射中就有机会迎娶公主。
第一个男士把苹果射中,他说:“I’m 罗宾。”
第二个男士也把苹果射中,他说:“I’m 后羿。”
第三个男士不小心把公主射死了,他说:“ I’m sorry…”
32.某人在精神病院实习,忽一神经病患者手持一把菜刀向他追来,这人转头就跑,直到跑到一条死胡同,心想这下完了,那个病人说:给你刀,该你追我了。
33.空姐劝乘客系安全带
“上次飞机迫降没系安全带的都摔的血肉模糊。”
问:“那系了安全带的那??”
答:“没事,都坐的好好的,跟活人一样。”
34.某学校新建一雕塑—少女左手捧书右手举一白鸽。校领导向校内学生公开召集名字。一时间回复络绎不绝,其中一名呼声最高:读书顶个鸟用!
35.太阳给草打电话
太阳:喂,草你吗?我日。
草:我草,你谁啊?
太阳:我日啊
草:我草,你到底谁啊
太阳:我日啊,你草吧
草:TMD,你到底是谁啊,我草
太阳:我日,我日啊
草:我草。
太阳的妈妈抢过电话:草,我日他妈,草你妈好吗?
36.男女朋友一起去逛街,
女朋友:哎哟,脚好酸哦。
男朋友很紧张:怎么了?是不是踩到柠檬了?
37.小熊问小白兔:”你掉毛吗?”小白兔说:”不掉”,小熊又问:”你真的掉毛吗?”小白兔说:”真的不掉”,于是小熊拿小白兔擦屁股.
38.小白兔到面包店里:老板,有一百个小面包吗?老板:没有。 第二天小白兔又来了:老板,有一百个小面包吗?老板:不好意思,没有。
第三天小白兔一进门:老板,有一百个小面包吗?老板:真是太不好意思了,还是没有。
第四天小白兔蹦蹦跳跳就来了:老板,有一百个小面包吗?老板:太好了!今天有一百个小面包~!
小白兔:太好了!给我来两个!
39.父子二人坐公交车。
儿子:爸爸,什么时候到啊?
父亲:停了就到了。
儿子:什么时候停啊?
父亲:到了就停了。
40.有一个人和一只老虎被分别绑在两颗大树上,绑老虎的绳子下面有一棵蜡烛 ,就快把绳子烧断了,如果绳子被烧断,老虎就会把人吃掉,结果人说了一句话,就没被老虎吃掉
他说“happy birthday!!”老虎就把蜡烛吹灭了...
41. 狼刚失恋,觅食时路过一间小屋,听到一男人教训自己的孩子:“再哭,就把你扔出去  喂狼小孩在屋里哭了一夜,狼在外面守了一夜,早上起来,狼哽咽得说:男人,男人都是骗子!!!
42.女孩问男友”你到底喜欢我哪一点啊”
男友被缠得没办法”我我我我喜欢你离我远一点”
43. 第一天,小白兔去河边钓鱼,什么也没钓到,回家了。
第二天,小白兔又去河边钓鱼,还是什么也没钓到,回家了。
第三天,小白兔刚到河边,一条大鱼从河里跳出来,冲着小白兔大叫:
你他妈的要是再敢用胡箩卜当鱼饵,我就扁死你!
44.某君第一次坐飞机,恐惧,不敢睁眼,15分钟后睁眼,往窗外看,大叫:”哎呀,飞的真高,人都象蚂蚁一样.!”
邻坐道:”那就是蚂蚁,飞机还没起飞.”
45.女友发短信给我:“我们还是分手吧!”
过一会,我又收到:“对不起,发错了!!”
46.三毛去发型屋做发型,对发型师说:给我编个麻花辫。发型师不小心弄掉了三毛的一根头发。三毛叹口气说:那来个中分好拉。可是发型师不小心又弄掉了根。三毛一看火了:你丫的想让我披头散发?
47.从前有一颗软糖,在街上走了很久,突然说:我的脚好软哦
48.男: 你喜欢我吗?
女: 你猜.
男: 喜欢!
女: 你再猜.
49.某精神病人在写东西,医生问:”写什么呢?”
“写信.”
“写给谁?”
“我啊.”
“写的什么呀?”
“白痴,我还没收到怎么知道!?”
50.一边……一边……
小朋友: 他一边脱衣服,一边穿裤子.
老师批语: 他到底是要脱啊?还是要穿啊?
题目:其中
小朋友:我的其中一只左脚受伤了。
老师批语:你是蜈蚣吗?
题目:陆陆续续
小朋友:下班了,爸爸陆陆续续的回家了。
老师批语:你到底有几个爸爸呀?
题目:难过
小朋友:我家门前有条水沟很难过。
老师批语:老师更难过
题目:又 又
小朋友:我的妈妈又矮又高又胖又瘦。
老师批语:你的妈妈 是变形金钢吗?
题目:你看
小朋友:你看什么看!没看过啊 ?
老师评语: 不要太拽了
题目:欣欣向荣
小朋友写: 欣欣向荣荣告白.
老师评语:连续剧不要看太多了!
题目 : 好吃
小朋友写: 好吃个屁.
老师:………
题目: 天真
小朋友写: 今天真热.
老师评语: 你真天真
题目: 果然
小朋友说: 昨天我吃水果.然后喝凉水
老师评语:是词组,不能分开的
题目:先……再…… 例题 :先吃饭,再洗澡.
小朋友:先生,再见!
老师评语:……………..
题目:况且
小朋友:一列火车经过,况且况且况且况且
老师批语:我死了算了

javascript中scrollLeft与scrollTop的引用之FireFox与IE的区别

javascript中的scrollLeft,scrollTop在不同浏览器中引用有所不同。比如在IE中我们需要这样写:if(document.documentElement){ x=event.clientX+document.documentElement.scrollLeft;
y=event.clientY+document.documentElement.scrollTop;
}
在FireFox中需要这样写:
else if(document.body){
x=event.clientX+document.body.scrollLeft;
y=eventclientY+document.body.scrollTop;}

回首北京的岁月真美丽

在北上的路上,充满着欢心和喜悦,是呀,从小的梦想,就希望有一天能到首都去看一下啊,到天安门城楼去玩儿一下,如今这个梦想就要实现了,能不高兴吗,能不喜悦吗? 能不激动人心吗? 望着轨道两旁一排排高楼大厦,和一片片防护林,啊,这就是北京,这就是祖国的首都。 下了火车,走在这繁华的都市里,耳旁不停的听到,北京纯正的普通话,街道两旁站着很多志愿者,他们是那样的热情,“您好,请问有什么可以帮助的吗?”,“您好,请问您准备到哪里去呢?”,这种热情充斥着城市的角落,让人久久不能忘怀。
到了北京之后,那一定得去天安门广场了,我们步行穿过南池子大街和北池子大街,沿路都是古建筑,一种深沉凝重的感觉,临近长安街,只见附近沾满了解放军战士和警察,只见没3到5米开外,就站立一个执勤民警,我感受到首都的神圣和庄严,沿着长安街向东走去,只见宏伟的天安门广场,人民大会堂和人民英雄纪念碑映入眼帘,正在自己欣喜的时候,却听见同伴的惊叫,转眼一看,\”啊,一抔鸟屎,全落在他的衣袖上了\”,随即退后一步,往上一看,原来这么多鸟在树上,在回望地下,斑斑驳驳,到处是鸟的粪便,天哪,我们赶紧退出林荫,直接走大道了。 看来,正是天安门环境的安逸,才有这么多鸟儿栖息呀。  朋友是又喜又悲,好不容易出来一趟,竟然搞得一身脏臭。在我的不断却说下,还是决定前去游玩了。不一会儿就走到天安门前了,望着庄严的天安门城楼,就显得如此高兴和神往了,走进天安门,只见里面有着各种各样的古玩和其他的古品展示,只可惜只能看,否则还是要收费的,再往里走,哈哈,一幅英姿飒爽的三军仪仗队训练场面,顿时扑面而至,看着威武的军人,只感觉内心澎湃起伏,久久不能平静。
转身回去,到了对面的天安门广场,我在想,到了北京一定要看看毛爷爷,在宽阔的天安门广场中,只见前面拍着几对人,密密麻麻的,过去一看,果然是毛主席纪念堂,不过人真多啊,排队排了老长了,哎,没办法,只能老老实实的站着,心中不禁充满着向往和期待,终于两个小时后,终于轮到我了,走进安保室,接受了安保扫描,真不可思议,一个钥匙也能给扫描出来,还有记得当时身上还带了个眼镜盒,结果呢被女民警给扫描出来了,她微笑的说:“呵呵,你这是眼镜盒吧,嗯,好了,拿好吧”,说着就把扫描过的物件递给我了,我急忙的走进纪念堂,只见毛主席静静的躺在那里,安详而又和蔼。四周一片肃穆,甚至听不到呼吸的声音,只感到人们静静地带着朝圣般的心情,凝望着毛主席,怀着对于一个伟人的无限崇敬和爱戴…

hibernate实现自定义分页示例代码

jsp页面:
<script type=”text/javascript”>
function pageFirst(count){
var currentPage = count;
if(currentPage >= 1)
{
document.getElementById(“pagination”).currentPage.value = 1;
document.getElementById(“pagination”).submit();
}
}

function pageFront(count){
var currentPage = count;
if(currentPage >=1)
{
document.getElementById(“pagination”).currentPage.value = count;
document.getElementById(“pagination”).submit();
}
else
{
return;
}
}

function pageNext(count){
var currentPage =count;
var totalPage =${totalPage};

if(currentPage < totalPage)
{
document.getElementById(“pagination”).currentPage.value =count;
document.getElementById(“pagination”).submit();
}
else
{
return;
}
}

function pageLast(count){
var currentPage = count;
var totalPage = ${totalPage};
if(currentPage <= totalPage)
{
document.getElementById(“pagination”).currentPage.value =totalPage;
document.getElementById(“pagination”).submit();
}
}
function toPage(count){
var currentPage = count;
var totalPage = ${totalPage};
if(currentPage > totalPage)
{
document.getElementById(“pagination”).currentPage.value=totalPage;
}
if(currentPage<1){
document.getElementById(“pagination”).currentPage.value=1;
}
document.getElementById(“pagination”).submit();
}
</script>
<html:form action=”/dinner/findHotel.do?method=findMorePassagesAboutRes” method=”post” styleId=”pagination”>
<html:hidden property=”totalPage”/>
<html:hidden property=”maxRecord”/>
<table width=”95%” border=”0″ align=”center” cellpadding=”3″
cellspacing=”0″ class=”table3″>
<tr>
<td align=”right” class=”bianju_in”>
<div class=”body”>
[
<a href=”javascript:pageFirst(1);”>第一页</a>] [
<a href=”javascript:pageFront(${currentPage-1});”>上一页</a>]|
[
<a href=”javascript:pageNext(${currentPage+1});”>下一页</a>]
[
<a href=”javascript:pageLast(${totalPage});”>最后一页</a>]&nbsp;&nbsp;

<input name=”currentPage” id=”currentPage” size=”2″ value=”${currentPage}”/>页
<input type=”hidden” name=”maxRecord”
value=”${maxRecord}” />
<input type=”button” value=”>>”
onClick=”javascript:toPage(document.getElementById(‘currentPage’).value)” />
共 ${totalPage} 页&nbsp;
</div>
</td>
</tr>
</table>
</html:form>
Action页面:
public ActionForward findList(ActionMapping mapping,ActionForm form,HttpservletRequest request,HttpServletresponse response){
TBRestaurantActionForm restaurantForm=(TBRestaurantActionForm)form;
request.setAttribute(“recommend”,dealWithLeaf(restaurantForm,recommend));
request.setAttribute(“totalPage”, restaurantForm.getTotalPage());
request.setAttribute(“maxRecord”,restaurantForm.getMaxRecord());
request.setAttribute(“currentPage”, restaurantForm.getCurrentPage());
}
public List dealWithLeaf(RestaurantActionForm form,List list){
RestaurantActionForm myform=(RestaurantActionForm)form;
long maxRecord=myform.getMaxRecord();
if(maxRecord%FETCHSIZE==0){ //刚好均匀分配
myform.setTotalPage((int)(maxRecord/FETCHSIZE));
return getFetchSizeByPageNo(myform.getCurrentPage(),list);
}
else{
myform.setTotalPage((int)(maxRecord/FETCHSIZE)+1);
List newlist=new ArrayList();
if(myform.getCurrentPage()<myform.getTotalPage()){
for (int i =(myform.getCurrentPage()-1)*FETCHSIZE; i <=myform.getCurrentPage()*FETCHSIZE-1 ; i++) {
newlist.add(list.get(i));
}
}
else{
for (int i = (myform.getCurrentPage()-1)*FETCHSIZE; i <maxRecord; i++) {
newlist.add(list.get(i));
}
}
return newlist;
}
}
public List getFetchSizeByPageNo(int currentPage,List list){
List newlist=new ArrayList();
for (int i =(currentPage-1)*FETCHSIZE; i <currentPage*FETCHSIZE-1; i++) {
newlist.add(i,list.get(i));
}
return newlist;
}

Dao页面:
public List<TBRestaurant> findTBRestaurantInfo(){
List<TBRestaurant> list=getHiberntateTemplate().find(“from TBRestaurant”);
return list;
}

允许Google收录或禁止收录

禁止搜索引擎收录的方法
什么是robots.txt文件?
搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息。spider在访问一个网站时,会首先会检查该网站的根域下是否有一个叫做robots.txt的纯文本文件。您可以在您的网站中创建一个纯文本文件robots.txt,在文件中声明该网站中不想被robot访问的部分或者指定搜索引擎只收录特定的部分。

请注意,仅当您的网站包含不希望被搜索引擎收录的内容时,才需要使用robots.txt文件。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件或者创建一个内容为空的robots.txt文件。

 

robots.txt文件放在哪里?
robots.txt文件应该放在网站根目录下。举例来说,当spider访问一个网站(比如http://www.abc.com)时,首先会检查该网站中是否存在http://www.abc.com/robots.txt这个文件,如果机器人找到这个文件,它就会根据这个文件的内容,来确定它访问权限的范围。

网站 URL 相应的 robots.txt的 URL
http://www.w3.org/ http://www.w3.org/robots.txt
http://www.w3.org:80/ http://www.w3.org:80/robots.txt
http://www.w3.org:1234/ http://www.w3.org:1234/robots.txt
http://w3.org/ http://w3.org/robots.txt

我放置或者刚刚修改了robots.txt的内容,大约多长时间能生效?
baiduspider通常每天访问一次网站的robots.txt文件,您对robots所做的修改,会在48小时内生效。需要注意的是,robots.txt禁止收录以前百度已收录的内容,从搜索结果中去除可能需要数月的时间。

 

我在robots.txt中设置了禁止百度收录我网站的内容,为何还出现在百度搜索结果中?
如果其他网站链接了您robots.txt文件中设置的禁止收录的网页,那么这些网页仍然可能会出现在百度的搜索结果中,但您的网页上的内容不会被抓取、建入索引和显示,百度搜索结果中展示的仅是其他网站对您相关网页的描述。

返回页首

禁止搜索引擎在搜索结果中显示网页快照,而只对网页建索引
百度支持通过设置网页的meta,防止搜索引擎显示网站的快照。方法如下:

要防止所有搜索引擎显示您网站的快照,请将此元标记置入网页的 <HEAD> 部分:

<meta name=”robots” content=”noarchive”>

要允许其他搜索引擎显示快照,但仅防止百度显示,请使用以下标记:

<meta name=”baiduspider” content=”noarchive”>

注:此标记只是禁止百度显示该网页的快照,百度会继续为网页建索引,并在搜索结果中显示网页摘要。

 

robots.txt文件的格式
“robots.txt”文件包含一条或更多的记录,这些记录通过空行分开(以CR,CR/NL, or NL作为结束符),每一条记录的格式如下所示:

“<field>:<optionalspace><value><optionalspace>”。

在该文件中可以使用#进行注解,具体使用方法和UNIX中的惯例一样。该文件中的记录通常以一行或多行User-agent开始,后面加上若干Disallow和Allow行,详细情况如下:

User-agent:

该项的值用于描述搜索引擎robot的名字。在”robots.txt”文件中,如果有多条User-agent记录说明有多个robot会受到”robots.txt”的限制,对该文件来说,至少要有一条User-agent记录。如果该项的值设为*,则对任何robot均有效,在”robots.txt”文件中,”User-agent:*”这样的记录只能有一条。如果在”robots.txt”文件中,加入”User-agent:SomeBot”和若干Disallow、Allow行,那么名为”SomeBot”只受到”User-agent:SomeBot”后面的Disallow和Allow行的限制。

Disallow:

该项的值用于描述不希望被访问的一组URL,这个值可以是一条完整的路径,也可以是路径的非空前缀,以Disallow项的值开头的URL不会被robot访问。例如”Disallow:/help”禁止robot访问/help.html、/helpabc.html、/help/index.html,而”Disallow:/help/”则允许robot访问/help.html、/helpabc.html,不能访问/help/index.html。”Disallow:”说明允许robot访问该网站的所有url,在”/robots.txt”文件中,至少要有一条Disallow记录。如果”/robots.txt”不存在或者为空文件,则对于所有的搜索引擎robot,该网站都是开放的。

Allow:

该项的值用于描述希望被访问的一组URL,与Disallow项相似,这个值可以是一条完整的路径,也可以是路径的前缀,以Allow项的值开头的URL是允许robot访问的。例如”Allow:/hibaidu”允许robot访问/hibaidu.htm、/hibaiducom.html、/hibaidu/com.html。一个网站的所有URL默认是Allow的,所以Allow通常与Disallow搭配使用,实现允许访问一部分网页同时禁止访问其它所有URL的功能。

需要特别注意的是Disallow与Allow行的顺序是有意义的,robot会根据第一个匹配成功的Allow或Disallow行确定是否访问某个URL。

使用”*”和”$”:

baiduspider支持使用通配符”*”和”$”来模糊匹配url。

“$” 匹配行结束符。

“*” 匹配0或多个任意字符。

返回页首

URL匹配举例
Allow或Disallow的值 URL 匹配结果
/tmp /tmp yes
/tmp /tmp.html yes
/tmp /tmp/a.html yes
/tmp/ /tmp no
/tmp/ /tmphoho no
/tmp/ /tmp/a.html yes
/Hello* /Hello.html yes
/He*lo /Hello,lolo yes
/Heap*lo /Hello,lolo no
html$ /tmpa.html yes
/a.html$ /a.html yes
htm$ /a.html no
返回页首

robots.txt文件用法举例
例1. 禁止所有搜索引擎访问网站的任何部分
下载该robots.txt文件

User-agent: *
Disallow: /

例2. 允许所有的robot访问

(或者也可以建一个空文件 “/robots.txt”)

User-agent: *
Disallow:

或者

User-agent: *

Allow: /

例3. 仅禁止baiduspider访问您的网站 User-agent: baiduspider
Disallow: /

例4. 仅允许baiduspider访问您的网站 User-agent: baiduspider
Disallow:

User-agent: *

Disallow: /

例5.禁止spider访问特定目录
在这个例子中,该网站有三个目录对搜索引擎的访问做了限制,即robot不会访问这三个目录。需要注意的是对每一个目录必须分开声明,而不能写成 “Disallow: /cgi-bin/ /tmp/”。

User-agent: *
Disallow: /cgi-bin/

Disallow: /tmp/

Disallow: /~joe/

例6. 允许访问特定目录中的部分url
User-agent: *
Allow: /cgi-bin/see

Allow: /tmp/hi

Allow: /~joe/look

Disallow: /cgi-bin/

Disallow: /tmp/

Disallow: /~joe/

例7. 使用”*”限制访问url
禁止访问/cgi-bin/目录下的所有以”.htm”为后缀的URL(包含子目录)。

User-agent: *
Disallow: /cgi-bin/*.htm

例8. 使用”$”限制访问url
仅允许访问以”.htm”为后缀的URL。

User-agent: *
Allow: .htm$

Disallow: /

例9. 禁止访问网站中所有的动态页面
User-agent: *
Disallow: /*?*

JQuery各种插件集合

概述jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及的,它兼容 CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。 jQuery 是一个快速的,简洁的 javaScript 库,使用户能更方便地处理 HTML documents、events、实现动画效果,并且方便地为网站提供 AJAX 交互。 jQuery 还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。 jQuery 能够使用户的 html 页保持代码和 html 内容分离,也就是说,不用再在 html 里面插入一堆js来调用命令了,只需定义 id 即可。今天在Kollermedia.at上发现了一篇JQuery插件列表的文章,特推荐如下。
文件上传(File upload)Ajax File Upload.
jQUploader.
Multiple File Upload plugin.
jQuery File Style.
Styling an input type file.
Progress Bar Plugin.
表单验证(Form Validation)jQuery Validation.
Auto Help.
Simple jQuery form validation.
jQuery XAV – form validations.
jQuery AlphaNumeric.
Masked Input.
TypeWatch Plugin.
Text limiter for form fields.
Ajax Username Check with jQuery.
表单-选取框(Form – Select Box stuff)jQuery Combobox.
jQuery controlled dependent (or Cascadign) Select List.
Multiple Selects.
Select box manipulation.
Select Combo Plugin.
jQuery – LinkedSelect
Auto-populate multiple select boxes.
Choose Plugin (Select Replacement).
表单基本、输入框、选择框等(Form Basics, Input Fields, Checkboxes etc.)jQuery Form Plugin.
jQuery-Form.
jLook Nice Forms.
jNice.
Ping Plugin.
Toggle Form Text.
ToggleVal.
jQuery Field Plugin.
jQuery Form’n Field plugin.
jQuery Checkbox manipulation.
jTagging.
jQuery labelcheck.
Overlabel.
3 state radio buttons.
ShiftCheckbox jQuery Plugin.
Watermark Input.
jQuery Checkbox (checkboxes with imags).
jQuery SpinButton Control.
jQuery Ajax Form Builder.
jQuery Focus Fields.
jQuery Time Entry.

Javascript之 Position的Fixed,relative,absolute,static直接的不同

Short answer: Yes, there is one more, “static”, which is the default. Yes, they majorly differ. Each of them is incredibily useful and which you should use of course depends on the desired result. Also, don’t forget about float, which is an important part of positioning.

Medium answer: I’m not going to do a “long answer” because there is no need to rewrite what has been written many times before, but I will do a “medium answer” here were we can quickly run through each type. I also sometime refer people to this 10 step tutorial, which does a pretty good job of explaining it.

An important concept to understand first is that every single element on a web page is a block. Literally a rectangle of pixels. This is easy to understand when when you set the element to display: block; or if that element is by default display: block; This means you can set a width and a height and that element will respect that. But elements that are display: inline, like a span by default, are also rectangles, they just flow onto the page different, lining up horizontally as they can.

Now that you are picturing every single page element as a block of pixels, we can talk about how positioning is used to get the blocks of pixels exactly where you want them to go. We’re going to leave off any discussion of the box model, but that factors into this as well…

Static. This is the default for every single page element. Different elements don’t have different default values for positioning, they all start out as static. Static doesn’t mean much, it just means that the element will flow into the page as it normally would. The only reason you would ever set an element to position: static is to forcefully-remove some positioning that got applied to an element outside of your control. This is fairly rare, as positioning doesn’t cascade.
Relative. This type of positioning is probably the most confusing and misused. What it really means is “relative to itself”. If you set position: relative; on an element but no other positioning attributes (top, left, bottom or right), it will no effect on it’s positioning at all, it will be exactly as it would be if you left it as position: static; But if you DO give it some other positioning attribute, say, top: 10px;, it will shift it’s position 10 pixels DOWN from where it would NORMALLY be. I’m sure you can imagine, the ability to shift an element around based on it’s regular position is pretty useful. I find myself using this to line up form elements many times that have a tendency to not want to line up how I want them to.

There are two other things that happen when you set position: relative; on an element that you should be aware of. One is that it introduces the ability to use z-index on that element, which doesn’t really work with statically positioned elements. Even if you don’t set a z-index value, this element will now appear on top of any other statically positioned element. You can’t fight it by setting a higher z-index value on a statically positioned element. The other thing that happens is it limits the scope of absolutely positioned child elements. Any element that is a child of the relatively positioned element can be absolutely positioned within that block. This brings up some powerful opportunities which I talk about here.

Absolute. This is a very powerful type of positioning that allows you to literally place any page element exactly where you want it. You use the positioning attributes top, left bottom and right to set the location. Remember that these values will be relative to the next parent element with relative (or absolute) positioning. If there is no such parent, it will default all the way back up to the <html> element itself meaning it will be placed relatively to the page itself.

The trade-off, and most important thing to remember, about absolute positioning is that these elements are removed from the flow of elements on the page. An element with this type of positioning is not affected by other elements and it doesn’t affect other elements. This is a serious thing to consider every time you use absolute positioning. It’s overuse or improper use can limit the flexibility of your site.

Fixed. This type of positioning is fairly rare but certainly has its uses. A fixed position element is positioned relative to the viewport, or the browser window itself. The viewport doesn’t change when the window is scrolled, so a fixed positioned element will stay right where it is when the page is scrolled, creating an effect a bit like the old school “frames” days. Take a look at this site, where the left sidebar is fixed. This site is a perfect example for since it exhibits both good and bad traits of fixed positioning. The good is that it keeps the navigation present at all times on the page and it creates and interested effect on the page. The bad is that there are some usability concerns. On my smallish laptop, the content in the sidebar is cut off and there is no way from me to scroll down to see the rest of that content. Also if I scroll all the way down to the footer, it overlaps the footer content not allowing me to see all of that. Cool effect, can be useful, but needs to be thoroughly tested