被一个人喜欢,接受她为我花钱,是一种享受
我其实中意各种各样的女人,相信大部分男的都是如此。
现在我有了女友,不是绯闻女友,是真正意义上的女友。关于她姓甚名谁身高体重职业出身这些东西,我一概不予披露。她未见得有多漂亮,眉眼五官没瑕疵而已,用带点艺术的眼光去打量,会感觉到一种气场,让人情不自禁想多看几眼。
她就是这种型!
我不叫她的名字,简化成一个字———“妞”,这称呼让她很兴奋也让我很满足。遇到妞之前,我心里就有了喜欢的女孩子的标准:乖、懂事、得体,发自内心地喜欢我,还有一点特别重要,要会做好吃的。
这些标准,妞全部满足,还附赠了我没来得及列入衡量标准的升级版本:有主见,又不是太有主见;聪明,又不觉得自己聪明。
我一直认为养家是男人的事情,一般来说,有这样消费观念的男人是比较讨女人喜欢的,男人大方是美德。
妞却不大欣赏我这个美德。她说:如果她没有收入和积蓄,我养她;如果她有收入和积蓄,我养家。基本上,我没在妞身上花过任何专项资金,有时说给你买个什么吧,她会酷得像王菲那样:“我有钱自己买!”有时先斩后奏买了,她也会很高兴,一周之内就会挑个同样档次的礼物回赠我。
这样的回礼有点叫板的味道,但我并不反感,喜欢一个人,为她花钱是一种乐趣;被一个人喜欢,接受她为我花钱,是一种享受。
我其实中意各种各样的女人,相信大部分男的都是如此。
现在我有了女友,不是绯闻女友,是真正意义上的女友。关于她姓甚名谁身高体重职业出身这些东西,我一概不予披露。她未见得有多漂亮,眉眼五官没瑕疵而已,用带点艺术的眼光去打量,会感觉到一种气场,让人情不自禁想多看几眼。
她就是这种型!
我不叫她的名字,简化成一个字———“妞”,这称呼让她很兴奋也让我很满足。遇到妞之前,我心里就有了喜欢的女孩子的标准:乖、懂事、得体,发自内心地喜欢我,还有一点特别重要,要会做好吃的。
这些标准,妞全部满足,还附赠了我没来得及列入衡量标准的升级版本:有主见,又不是太有主见;聪明,又不觉得自己聪明。
我一直认为养家是男人的事情,一般来说,有这样消费观念的男人是比较讨女人喜欢的,男人大方是美德。
妞却不大欣赏我这个美德。她说:如果她没有收入和积蓄,我养她;如果她有收入和积蓄,我养家。基本上,我没在妞身上花过任何专项资金,有时说给你买个什么吧,她会酷得像王菲那样:“我有钱自己买!”有时先斩后奏买了,她也会很高兴,一周之内就会挑个同样档次的礼物回赠我。
这样的回礼有点叫板的味道,但我并不反感,喜欢一个人,为她花钱是一种乐趣;被一个人喜欢,接受她为我花钱,是一种享受。
android的ImageSwitcher是一个图片更换而产生动画过渡的控件,appdemo里面有例子,其实是一个很好的图片浏览的例子,但有一个不好的地方就是选择小图时,速度太快,每个经过中点的小图都产生一次事件,导致大图切换效果不理想。
比如点击第一张,放大第一张,点击第三张,是先放大第二张,再放大第三张,滑动时经过的所有图片都显示一次,很不理想。
我们可以用线程来处理这个问题,一定的时间后如果选择的index值不变,说明已经稳定不变,显示大图。
修改一下即可:
完整代码见附件
下载文件
比如点击第一张,放大第一张,点击第三张,是先放大第二张,再放大第三张,滑动时经过的所有图片都显示一次,很不理想。
我们可以用线程来处理这个问题,一定的时间后如果选择的index值不变,说明已经稳定不变,显示大图。
修改一下即可:
/*
* 原代码
*/
// public void onItemSelected(AdapterView parent, View v, int position, long id) {
// mSwitcher.setImageResource(mImageIds[position]);
// }
/*
* code: hqlulu
* http://www.aslibra.com
* 增加以下代码
*/
private int showingIndex = -1;
private static final int TIME_OUT_DISPLAY = 300;
private int toShowIndex = 0;
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Log.v("test", "onItemSelected arg2="+arg2+" arg3="+arg3);
toShowIndex = arg2;
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(showingIndex != toShowIndex){
showingIndex = toShowIndex;
mSwitcher.setImageResource(mImageIds[toShowIndex]);
}
}
};
Thread checkChange = new Thread() {
public void run() {
int myIndex = toShowIndex;
try {
sleep( TIME_OUT_DISPLAY );
if( myIndex == toShowIndex ){
handler.sendEmptyMessage(0);
Log.v("test", "+++ stable can show ...");
}else{
Log.v("test", "+++ not stable...");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
checkChange.start();
}
* 原代码
*/
// public void onItemSelected(AdapterView parent, View v, int position, long id) {
// mSwitcher.setImageResource(mImageIds[position]);
// }
/*
* code: hqlulu
* http://www.aslibra.com
* 增加以下代码
*/
private int showingIndex = -1;
private static final int TIME_OUT_DISPLAY = 300;
private int toShowIndex = 0;
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Log.v("test", "onItemSelected arg2="+arg2+" arg3="+arg3);
toShowIndex = arg2;
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(showingIndex != toShowIndex){
showingIndex = toShowIndex;
mSwitcher.setImageResource(mImageIds[toShowIndex]);
}
}
};
Thread checkChange = new Thread() {
public void run() {
int myIndex = toShowIndex;
try {
sleep( TIME_OUT_DISPLAY );
if( myIndex == toShowIndex ){
handler.sendEmptyMessage(0);
Log.v("test", "+++ stable can show ...");
}else{
Log.v("test", "+++ not stable...");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
checkChange.start();
}
完整代码见附件
下载文件
代码是参考某位仁兄的片段,以下是可行的完整测试代码:
参考信息:
Getting Height of Status and Title Bar
package com.aslibra.test;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.widget.ImageView;
public class test extends Activity {
ImageView iv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView) this.findViewById(R.id.ImageView01);
iv.post(new Runnable()
{
public void run()
{
viewInited();
}
}
);
Log.v("test", "== ok ==");
}
private void viewInited(){
Rect rect= new Rect();
Window window= getWindow();
iv.getWindowVisibleDisplayFrame(rect);
int statusBarHeight= rect.top;
int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;
//测试结果:ok之后 100多 ms 才运行了
Log.v("test", "=-init-= statusBarHeight="+statusBarHeight+
" contentViewTop="+contentViewTop+
" titleBarHeight="+titleBarHeight);
}
/*
* 07-14 02:36:48.449: VERBOSE/test(1385): == ok ==
* 07-14 02:36:48.558: VERBOSE/test(1385): =-init-= statusBarHeight=25 contentViewTop=50 titleBarHeight=25
*/
}
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.widget.ImageView;
public class test extends Activity {
ImageView iv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView) this.findViewById(R.id.ImageView01);
iv.post(new Runnable()
{
public void run()
{
viewInited();
}
}
);
Log.v("test", "== ok ==");
}
private void viewInited(){
Rect rect= new Rect();
Window window= getWindow();
iv.getWindowVisibleDisplayFrame(rect);
int statusBarHeight= rect.top;
int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;
//测试结果:ok之后 100多 ms 才运行了
Log.v("test", "=-init-= statusBarHeight="+statusBarHeight+
" contentViewTop="+contentViewTop+
" titleBarHeight="+titleBarHeight);
}
/*
* 07-14 02:36:48.449: VERBOSE/test(1385): == ok ==
* 07-14 02:36:48.558: VERBOSE/test(1385): =-init-= statusBarHeight=25 contentViewTop=50 titleBarHeight=25
*/
}
参考信息:
Getting Height of Status and Title Bar
在上篇 android处理单击双击和滑动事件 里有介绍双击,可如果需要自己控制一个双击事件的单击间隔时间,怎么弄呢?
其实就是在单击之后,在间隔时间内等候下次点击再次发生,我们可以用线程处理等候时间,如果时间到了还没有下个点击,那就是取消双击的可能了,可以参考下面的代码:
其实就是在单击之后,在间隔时间内等候下次点击再次发生,我们可以用线程处理等候时间,如果时间到了还没有下个点击,那就是取消双击的可能了,可以参考下面的代码:
package com.aslibra.test;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
import android.widget.TextView;
/*
* 自定义双击等待时间
* http://www.aslibra.com/blog/post/android_doubleClick.php
*/
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private boolean waitDoubleClick = false;
private static final int DOUBLE_CLICK_TIME = 350;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
Log.v("test", "onSingleTapUp "+e.getX()+" "+e.getY());
if(!waitDoubleClick){
waitDoubleClick = true;
Log.v("test", "waitDoubleClick");
//等待下次点击
Thread checkUpdate = new Thread() {
public void run() {
//固定时间后如果还没有改变状态,说明是单击,取消等待状态
try {
sleep( DOUBLE_CLICK_TIME );
if(waitDoubleClick){
waitDoubleClick = false;
Log.v("test", "cancle waitDoubleClick");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
checkUpdate.start();
viewA.setText("");
}else{
//双击
waitDoubleClick = false;
onDoubleClick();
}
return true;
}
//双击事件
private void onDoubleClick(){
viewA.setText("dobule click");
Log.v("test", "DoubleClick");
}
}
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
import android.widget.TextView;
/*
* 自定义双击等待时间
* http://www.aslibra.com/blog/post/android_doubleClick.php
*/
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private boolean waitDoubleClick = false;
private static final int DOUBLE_CLICK_TIME = 350;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
Log.v("test", "onSingleTapUp "+e.getX()+" "+e.getY());
if(!waitDoubleClick){
waitDoubleClick = true;
Log.v("test", "waitDoubleClick");
//等待下次点击
Thread checkUpdate = new Thread() {
public void run() {
//固定时间后如果还没有改变状态,说明是单击,取消等待状态
try {
sleep( DOUBLE_CLICK_TIME );
if(waitDoubleClick){
waitDoubleClick = false;
Log.v("test", "cancle waitDoubleClick");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
checkUpdate.start();
viewA.setText("");
}else{
//双击
waitDoubleClick = false;
onDoubleClick();
}
return true;
}
//双击事件
private void onDoubleClick(){
viewA.setText("dobule click");
Log.v("test", "DoubleClick");
}
}
android有处理鼠标动作的GestureDetector,使用起来也挺方便,几个常用事件你都可以找到接口接入处理:
单击、双击(比如双击放大)、滑动(比如翻页)
下面是简化的例子,参考并整合所得,来源参考页尾参考内容:
参考资料:
1 GestureDetector and GestureDetector.OnGestureListener
2 how to implement android double tap?
单击、双击(比如双击放大)、滑动(比如翻页)
下面是简化的例子,参考并整合所得,来源参考页尾参考内容:
package com.aslibra.test;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
import android.widget.TextView;
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
gestureScanner.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener(){
public boolean onDoubleTap(MotionEvent e) {
viewA.setText("-" + "onDoubleTap" + "-");
//双击时产生一次
Log.v("test", "onDoubleTap");
return false;
}
public boolean onDoubleTapEvent(MotionEvent e) {
//双击时产生两次
Log.v("test", "onDoubleTapEvent");
return false;
}
public boolean onSingleTapConfirmed(MotionEvent e) {
viewA.setText("-" + "onSingleTapConfirmed" + "-");
//短快的点击算一次单击
Log.v("test", "onSingleTapConfirmed");
return false;
}
});
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.v("test", "onSingleTapUp");
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
return true;
}
}
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
import android.widget.TextView;
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
gestureScanner.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener(){
public boolean onDoubleTap(MotionEvent e) {
viewA.setText("-" + "onDoubleTap" + "-");
//双击时产生一次
Log.v("test", "onDoubleTap");
return false;
}
public boolean onDoubleTapEvent(MotionEvent e) {
//双击时产生两次
Log.v("test", "onDoubleTapEvent");
return false;
}
public boolean onSingleTapConfirmed(MotionEvent e) {
viewA.setText("-" + "onSingleTapConfirmed" + "-");
//短快的点击算一次单击
Log.v("test", "onSingleTapConfirmed");
return false;
}
});
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.v("test", "onSingleTapUp");
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
return true;
}
}
参考资料:
1 GestureDetector and GestureDetector.OnGestureListener
2 how to implement android double tap?
cygwin是非常实用的工具,和windows结合起来,对平时工作有很大帮助。
你可以像在linux服务器上操作文件一样操作本地文件,很不错的。可是一般使用dos命令窗口总不方便,那其实应该启用ssh服务,用别的程序登录管理,操作就方便多啦~~
需要安装以下两个包:
安装后,打开bash,运行以下命令初始化一些配置文件
启动服务:
你甚至可以关闭bash窗口,服务还是会在启用状态。
登录时,请输入本地用户的用户名和密码
参考:
1 Cygwin SSHD HowTo
2 http://www.cygwin.com/
你可以像在linux服务器上操作文件一样操作本地文件,很不错的。可是一般使用dos命令窗口总不方便,那其实应该启用ssh服务,用别的程序登录管理,操作就方便多啦~~
需要安装以下两个包:
Admin --> cygrunsrv
Net --> openssh
Net --> openssh
安装后,打开bash,运行以下命令初始化一些配置文件
ssh-host-config -y
启动服务:
cygrunsrv -S sshd
你甚至可以关闭bash窗口,服务还是会在启用状态。
登录时,请输入本地用户的用户名和密码
参考:
1 Cygwin SSHD HowTo
2 http://www.cygwin.com/






