分类目录归档:程序生活

Program Life – Web

Eclipse中高亮显示相同的变量

问题描述:

   在eclipse中使用快捷键或其他原因,不小心按错了,使得变量的高亮显示没了。
1.网友解决方法
选择:windows-> preferences->java->Editor->Mark Occurences
选择最上的复选框,下面的就有很多了。
其中的Local variables就是变量的高亮显示。
2.也有更简单的办法:
网上搜了一下,原来是Toggle Mark Occurrences (Alt + Shift + 0)
这个按钮没有按下,在工具栏的小黄颜色的笔 的形状的图标。

3.改变其颜色:
选择:windows-> preferences->java->Editor->Mark Occurences->第一行有个“Annotations”点击进入,显示出列表,找到 Occurrence annotation 右边选择Color即可。

MyEclipse10.x破解

  双击 run.bat 打开破解工具(前提已经安装jdk并正确配置了环境变量 classpath、Path)

  1、打开破解工具—- 先随便输入一个用户名和 点击systemid按钮生成systemId 再点击 active 即可得到用户名和激活码.
           但是这个systemId一般是错误的打开myeclipse—myeclipse—-Subscription Infomation–输入用户名 激活码—-activate now —web active—- 会看到一
         个网址 里面有参数 sytemId (这才是真正可以激活用到的systemId)复制出来

=======================  以上步骤是为了得到激活用的正确的systemId  systemId不对 就破解不成功!(得到正确systemId后 关闭 myeclipse)  ============================

2、得到systemId ,输入用户名 systemId 点击active 得到 激活用到的  用户名 激活码 activation code
3、 非常非常关键步骤: (破解工具的菜单栏)
                                 a1 、Tools—rebuildKey   a2、 Tools—saveProperties
                                 b1、 Tools—–Replace JarFile —–选择 你的安装目录/myeclipse/Common/plusgin 目录
     b2、Tools—saveProperties
4、打开myeclips 
myeclipse—-Subscription Infomation–输入用户名 激活码—-activate now—I already have activate code—输入ACTIVATION_CODE:(破解工具
                             中输出的 ACTIVATION_KEY)— next–破解成功!

image

 

myeclipse10破解 myeclipse10破解

在Android上使用ZXing识别条形码/二维码

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能…….手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等

本文使用ZXing 1.6实现条码/二维码识别。ZXing是个很经典的条码/二维码识别的开源类库,long long ago,就有开发者在J2ME上使用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力,而目前已经有不少Android手机具备自动对焦的功能。

本文代码运行的结果如下,使用91手机助手截图时,无法截取SurfaceView的实时图像:

本文使用了ZXing1.6的core,即把/zxing-1.6/core/下的src复制覆盖工程的src;另外还要使用到/zxing-1.6/android/下的PlanarYUVLuminanceSource.java。

PS:/zxing-1.6/android/ 是BarcodeScanner的源码,本文程序相当于BarcodeScanner的精简版,只保留最基本的识别功能。

本文源码工程的下载地址如下:http://www.pudn.com/downloads349/sourcecode/comm/android/detail1521939.html

源码目录结果如下图,ChecksumException.java下面还有很多源文件,截图尚未列出:

本文例子必须要开摄像头和自动对焦的权限,不然启动时会报异常,所用的权限如下:

<uses-permission android:name=”android.permission.CAMERA”></uses-permission>
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”></uses-permission>
<uses-feature android:name=”android.hardware.camera” />
<uses-feature android:name=”android.hardware.camera.autofocus” />

main.xml源码如下,main.xml必须要用到FrameLayout才能重叠控件实现“范围框”的效果:

<?xml version=”1.0″ encoding=”utf-8″?>
<FrameLayout android:id=”@+id/FrameLayout01″
android:layout_width=”fill_parent” android:layout_height=”fill_parent”
xmlns:android=”http://schemas.android.com/apk/res/android”>
<SurfaceView android:layout_height=”fill_parent”
android:id=”@+id/sfvCamera” android:layout_width=”fill_parent”></SurfaceView>
<RelativeLayout android:id=”@+id/RelativeLayout01″
android:layout_height=”fill_parent” android:layout_width=”fill_parent”>
<ImageView android:id=”@+id/ImageView01″
android:layout_height=”100dip” android:layout_width=”160dip”></ImageView>
<View android:layout_centerVertical=”true”
android:layout_centerHorizontal=”true” android:layout_width=”300dip”
android:background=”#55FF6666″ android:id=”@+id/centerView”
android:layout_height=”180dip”></View>
<TextView android:layout_centerHorizontal=”true”
android:layout_width=”wrap_content” android:layout_below=”@+id/centerView”
android:layout_height=”wrap_content” android:text=”Scanning…”
android:id=”@+id/txtScanResult” android:textColor=”#FF000000″></TextView>
</RelativeLayout>
</FrameLayout>

testCamera.java是主类,负责控制Camera和对图像做解码,源码如下:

package com.testCamera;
import java.util.Timer;
import java.util.TimerTask;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.Android.PlanarYUVLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import android.app.Activity;
import android.graphics.Bitmap;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class testCamera extends Activity {
/** Called when the activity is first created. */
private SurfaceView sfvCamera;
private SFHCamera sfhCamera;
private ImageView imgView;
private View centerView;
private TextView txtScanResult;
private Timer mTimer;
private MyTimerTask mTimerTask;
// 按照标准HVGA
final static int width = 480;
final static int height = 320;
int dstLeft, dstTop, dstWidth, dstHeight;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTitle(“Android条码/二维码识别Demo—–hellogv”);
imgView = (ImageView) this.findViewById(R.id.ImageView01);
centerView = (View) this.findViewById(R.id.centerView);
sfvCamera = (SurfaceView) this.findViewById(R.id.sfvCamera);
sfhCamera = new SFHCamera(sfvCamera.getHolder(), width, height,
previewCallback);
txtScanResult=(TextView)this.findViewById(R.id.txtScanResult);
// 初始化定时器
mTimer = new Timer();
mTimerTask = new MyTimerTask();
mTimer.schedule(mTimerTask, 0, 80);
}

class MyTimerTask extends TimerTask {
@Override
public void run() {
if (dstLeft == 0) {//只赋值一次
dstLeft = centerView.getLeft() * width
/ getWindowManager().getDefaultDisplay().getWidth();
dstTop = centerView.getTop() * height
/ getWindowManager().getDefaultDisplay().getHeight();
dstWidth = (centerView.getRight() – centerView.getLeft())* width
/ getWindowManager().getDefaultDisplay().getWidth();
dstHeight = (centerView.getBottom() – centerView.getTop())* height
/ getWindowManager().getDefaultDisplay().getHeight();
}
sfhCamera.AutoFocusAndPreviewCallback();
}
}
/**
*  自动对焦后输出图片
*/
private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera arg1) {
//取得指定范围的帧的数据
PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
data, width, height, dstLeft, dstTop, dstWidth, dstHeight);
//取得灰度图
Bitmap mBitmap = source.renderCroppedGreyscaleBitmap();
//显示灰度图
imgView.setImageBitmap(mBitmap);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
MultiFormatReader reader = new MultiFormatReader();
try {
Result result = reader.decode(bitmap);
String strResult = “BarcodeFormat:”
+ result.getBarcodeFormat().toString() + ”  text:”
+ result.getText();
txtScanResult.setText(strResult);
} catch (Exception e) {
txtScanResult.setText(“Scanning”);
}
}
};
}

SFHCamera.java是Camera控制类,源码如下:

package com.testCamera;
import java.io.IOException;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
public class SFHCamera implements SurfaceHolder.Callback{
private SurfaceHolder holder = null;
private Camera mCamera;
private int width,height;
private Camera.PreviewCallback previewCallback;

public SFHCamera(SurfaceHolder holder,int w,int h,Camera.PreviewCallback previewCallback) {
this.holder = holder;
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
width=w;
height=h;
this.previewCallback=previewCallback;
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);//设置尺寸
parameters.setPictureFormat(PixelFormat.JPEG);
mCamera.setParameters(parameters);
mCamera.startPreview();//开始预览
Log.e(“Camera”,”surfaceChanged”);
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
mCamera = Camera.open();//启动服务
try {
mCamera.setPreviewDisplay(holder);//设置预览
Log.e(“Camera”,”surfaceCreated”);
} catch (IOException e) {
mCamera.release();//释放
mCamera = null;
}

}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();//停止预览
mCamera = null;
Log.e(“Camera”,”surfaceDestroyed”);
}
/**
* 自动对焦并回调Camera.PreviewCallback
*/
public void AutoFocusAndPreviewCallback()
{
if(mCamera!=null)
mCamera.autoFocus(mAutoFocusCallBack);
}

/**
* 自动对焦
*/
private Camera.AutoFocusCallback mAutoFocusCallBack = new Camera.AutoFocusCallback() {

@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {  //对焦成功,回调Camera.PreviewCallback
mCamera.setOneShotPreviewCallback(previewCallback);
}
}
};

}

其中testCamera.java的Camera.PreviewCallback previewCallback 是整个程序的逻辑核心,作为回调函数给SFHCamera.java的内部Camera类调用。

条码扫描二维码扫描——ZXing android 源码简化

前言

最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个以Apache License 2.0 开源的 ZXing项目。Zxing项目里的Android实现太过复杂多余东西太多,得对其进行简化。

前提条件

下载源代码:点击这里

编译核心库:Zxing的主页上有介绍具体步骤,大家也可以参照这篇博文:android 条码识别软件开发全解析(续2详解绝杀!)

导入项目

打开Eclipse 导入 源码中的 Android 项目,然后右击项目 选择“Build path”——》”Add External Archives” 把核心库 core.jar文件加入到项目中。

此时编译一下项目,会发现报错,“ Multiple substitutions specified in non-positional format; did you mean to add the formatted=”false” attribute?”之类的。打开raw 下的Values 发现错误是在一个<String>上。这里把 “preferences_custom_product_search_summary” 里的  %s  %f  全部都改成  %1$s  %1$f(因为我们用不到多国语言,建议只保留默认的Value ,其他全部删除)。

原因:由于新的SDK采用了新版本的aapt(Android项目编译器),这个版本的aapt编译起来会比老版本更加的严格,然后在Android最新的开发文档的描述String的部分,已经说明如何去设置 %s 等符号

“If you need to format your strings using String.format(String, Object…) , then you can do so by putting your format arguments in the string resource. For example, with the following resource:

<string name=”welcome_messages”>Hello, %1$s! You have %2$d new messages.</string>

In this example, the format string has two arguments: %1$s is a string and %2$d is a decimal number. You can format the string with arguements from your application…“

经过以上步骤后项目应该就可以运行了。

但是ZXing的android项目东西太多了,有很多是我们不需要的,得新建另一个项目简化它。

简化

在开始前大致介绍一下简化ZXing需要用到各个包 、类的职责。

  • CaptureActivity。这个是启动Activity 也就是扫描器(如果是第一安装,它还会跳转到帮助界面)。
  • CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
  • DecodeThread 解码的线程。
  • com.google.zxing.client.android.camera 包,摄像头控制包。
  • ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了。

新建另一个项目

新建另一个项目将启动的Activity命名为CaptureActivity,并导入核心库。项目新建完成后我们打开 CaptureActivity 的布局文件,我这里为main。把里面的XML修改为:

复制代码
1 <FrameLayout xmlns:android=”http://schemas.android.com/apk/res/android”
2 android:layout_width=”fill_parent” android:layout_height=”fill_parent”>
3 <SurfaceView android:id=”@+id/preview_view”
4 android:layout_width=”fill_parent” android:layout_height=”fill_parent”
5 android:layout_centerInParent=”true”/>
6
7 <com.Zxing.Demo.view.ViewfinderView
8 android:id=”@+id/viewfinder_view” android:layout_width=”fill_parent”
9 android:layout_height=”fill_parent” android:background=”@android:color/transparent”/>
10 <TextView android:layout_width=”wrap_content”
11 android:id=”@+id/txtResult”
12 android:layout_height=”wrap_content” android:text=”@string/hello”/>
13
14  </FrameLayout>
复制代码

可以看到在XML里面用到了 ViewfinderView 自定义view 。所以新建一个View 的包,然后把:ViewfinderView 和 ViewfinderResultPointCallback 靠到里面(记得对应修改XML里面的包)。

打开 CaptureActivity 覆盖 onCreate 方法:

复制代码
1 @Override
2 publicvoid onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.main);
5 //初始化 CameraManager
6   CameraManager.init(getApplication());
7
8 viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
9 txtResult = (TextView) findViewById(R.id.txtResult);
10 hasSurface =false;
11 inactivityTimer =new InactivityTimer(this);
12 }
复制代码

这里调用到的 CameraManager 类是控制摄像头的包里的类。新建一个camera包把:com.google.zxing.client.android.camera 里面的类全部拷入,另外我把PlanarYUVLuminanceSource也拷入到这个包里面。根据错误的提示来修正代码,主要是修改正包结构。(整 个简化的流程都是如此:“根据错误提示,修改代码”)。

在修改的过程中,有很多是关于R 资源的问题,在此我们需要将Values  里面的两个xml资源文件拷入项目中:colos.xml 和ids.xml 。 ctrl+b 一下看看error 是不是少了很多。在CameraManager中有些地方需要用到项目的配置,这里需要把配置直接写入代码中:

// SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
//是否使用前灯
// if (prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false)) {
// FlashlightManager.enableFlashlight();
// }
FlashlightManager.enableFlashlight();

使用摄像头需要加入相应的权限:

<uses-permission android:name=”android.permission.CAMERA”></uses-permission>
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”></uses-permission>
<uses-feature android:name=”android.hardware.camera”/>
<uses-feature android:name=”android.hardware.camera.autofocus”/>
<uses-permission android:name=”android.permission.VIBRATE”/>
<uses-permission android:name=”android.permission.FLASHLIGHT”/>

当View 和 camera 包里的错误修正完成后,我们继续来看CaptureActivity。

覆盖onResume方法初始化摄像头:

复制代码
@Override
protectedvoid onResume() {
super.onResume();
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
if (hasSurface) {
initCamera(surfaceHolder);
} else {
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
decodeFormats =null;
characterSet =null;

playBeep =true;
AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
playBeep =false;
}
initBeepSound();
vibrate =true;
}

复制代码
initCamera
SurfaceHolder接口实现

initCamera () 方法用于初始化摄像头,如果排除了所有的error ,运行项目时就可以看到大致扫描界面了。 surfaceHolder.addCallback(this);表示让CaptureActivity实现其callback接口。

handler = new CaptureActivityHandler(this, decodeFormats,characterSet) 用于进行扫描解码处理。

解码

上面的步骤主要都是用于对摄像头的控制,而解码的真正工作入口是在CaptureActivityHandler 里面的。新建一个Decoding包把以下文件拷入包中:

  • CaptureActivityHandler
  • DecodeFormatManager
  • DecodeHandler
  • DecodeThread
  • FinishListener
  • InactivityTimer
  • Intents

由于我们的包结构和Zxing 项目的有所不同所以需要注意一下类的可访问性

同样开始ctrl+B 编译一下,然后开始修正错误。

在CaptureActivityHandler 里 把 handleMessage 里的部分方法先注释掉如:“decode_succeeded ”分支,这是解码成功时调用 CaptureActivity 展示解码的结果。

在DecodeThread 类里,修改部分涉及Preference配置的代码:

复制代码
DecodeThread(CaptureActivity activity,
Vector<BarcodeFormat> decodeFormats,
String characterSet,
ResultPointCallback resultPointCallback) {

this.activity = activity;
handlerInitLatch =new CountDownLatch(1);

hints =new Hashtable<DecodeHintType, Object>(3);

//// The prefs can’t change while the thread is running, so pick them up once here.
// if (decodeFormats == null || decodeFormats.isEmpty()) {
// SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
// decodeFormats = new Vector<BarcodeFormat>();
// if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_1D, true)) {
// decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);
// }
// if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_QR, true)) {
// decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
// }
// if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_DATA_MATRIX, true)) {
// decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
// }
// }
if (decodeFormats ==null|| decodeFormats.isEmpty()) {
decodeFormats =new Vector<BarcodeFormat>();
decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);
decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);

}

hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);

if (characterSet !=null) {
hints.put(DecodeHintType.CHARACTER_SET, characterSet);
}

hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback);
}

复制代码

这里是设置 解码的类型,我们现在默认将所有类型都加入。

错误类型基本上都是:包结构、PreferencesActivity 的配置 、类可访问性的问题。根据错误提示耐心把错误解决。

返回解码结果

还记得在 CaptureActivityHandler 的 messagehandler 里注销掉的Case分支吗?现在CaptureActivity 里实现它。

复制代码
publicvoid handleDecode(Result obj, Bitmap barcode) {
inactivityTimer.onActivity();
viewfinderView.drawResultBitmap(barcode);
playBeepSoundAndVibrate();
txtResult.setText(obj.getBarcodeFormat().toString() +”:”
+ obj.getText());
}
复制代码

最后

ZXing的简化已基本完成,有几位是可以运行成功的?呵呵。

下面是CaptureActivity的源码:

CaputreActivity

简化过的包结构图:

简化后的ZXing 更加方便我们了解ZXing项目 是如何解码的。只要仔细查看源码,进行单点跟踪调试,相信大家很容易能理解。

顾客是上帝

很多人留言要源码, 其实我这不是什么源码,我只是把ZXing的东西简化了一下而已。事实上我也不喜欢直接放源码项目,这样大家就不想读ZXing的源码了。

下面是我简化的版本:Zxing简化

很多人需要Core 核心包(其实ZXing的源码里面就有),这里提供下我写文章时的版本 1.6的:

Zxing

移动端交互原型设计软件Justinmind:为移动设计而生

据国内三大运营商披露的最新数字,截止 2012 年 1 月份,中国的手机用户数已达 9.8758 亿,即将逼近 10 亿大关。CNNIC最新的调查显示,截至 2012年6月,大陆5.38 亿的网民中,有 15.3%的

网民不使用PC(桌上型电脑),也不使用NB(笔记型电脑)上网,只使用手机上网。砖家解释,这个现象来自互联网向某些不便使用PC或NB的人群扩散的结果。阅读全文

智能手机功能越来越强大,同时价格不断走低,让手机上网变得廉价、方便,降低了移动智慧终端机的使用门槛,把原本用普通手机的用户转化成手机上网用户。

目前此现象还在发展中,推估单用手机上网的人群规模还将继续增长。
移动已经是不可阻挡的趋势,未来人们的获取信息、娱乐、交流的最主要渠道就是移动终端。交互在移动应用上发挥的作用更大,能够实现基于传感器的多种效果。
这里推荐一款专注移动端的交互设计软件:JustinMind。它是由西班牙JustinMind公司出品的原型制作工具,可以输出Html页面。http://www.justinmind.com/
与目前主流的交互设计工具axure,Balsamiq Mockups等相比,Justinmind Prototyper更为专属于设计移动终端上app应用。
下面先对JustinMind做一个简单的认识,这是该软件的主界面,共有5个功能分区:
下面是JustinMind的一些特性:
1.使用JustinMind,你可以在几分钟内利用其广泛的组件和交互绘制高保真原型。它提供了一些基本的形状,如矩形和文本,还有特定的组件,如菜单,表单或数据列表。
2.关于手势的交互效果:
JustinMind提供了多种触屏的交互效果,例如滑动、缩放、旋转,甚至捕捉设备方向等等。在需要产生效果的部件中选择对应的手势即可。
3.可以创建自己的组件库。
JustinMind为iPhone ,iPad,黑莓,Android提供了多样的组件。你可以创建自定义组件库,方法是将排列好的单个组件放在一起,并将它们集体框选拖动到组件库。
这样下次你就可以直接使用自己定义好的组件。
4.更为便捷的定义样式。
相比Axure,JustinMind更好的提供了属性窗口,并且更好的支持捕获PS等软件的图像属性。
5.JustinMind可以导出原型的所有信息到Microsoft Word。能够一键生成及其规范的文档。
6.共享原型进行测试。
JustinMind支持将原型上传到服务器并提供给他人进行测试,为产品的改进做出了良好的贡献。最为特别的是,基于usernote的服务允许你将原型放到移动设备上进行测试。
7.更友好的定义交互方式。
在JustinMind中,你可以通过拖拽等方式来实现跳转、定向等交互效果,无需像Axure一样每一步都只能通过点击来完成。并且显示更为直观,如进度条。
同时可以通过一些简单的无代码逻辑语句实现更为高级的交互效果。
8.全球范围内的复用、数据共享。
每一个模板都让这一套组件有不同的视觉风格,变量允许将数据从一个屏幕迁移到另一个,甚至使用它们来检查是否满足条件。
9.发布和收集反馈意见。
发布Prototyper作品到usernote后,全球各地的人将通过Web浏览器访问您的原型。他们的反馈结果将会实时的呈现在您的原型页面。
由于JustinMind在交互方式的实现以及原型的生成方面比较具有特点,所以我做了下面一些演示:
1.事件与交互
事件是JustinMind的一个关键功能,Justinmind Prototyper的事件由两个主要部分组成:一个是事件的触发(或用户事件),另一个是一组操作。每一个事件必须在屏幕上定义
一个特定的元素,这将作为事件的触发源。
这个就是事件窗口,在上文的主界面介绍中有过简单的介绍。
交互动作按照顺序依次排列下来,执行的顺序从上到下一目了然。       每个交互动作中有很多的操作,这些操作是从左到右依次执行的。只有这些操作执行完成后,才会到下一个交互动作。
2.关于链接的设置
使用链接最简单的操作就是,例如,点击Button跳转到Screen3,那么直接将Button拖拽到Screen3上面就可以了。
3.下面列举了一些常用的事件,可以看出来JustinMind的图标还是非常形象化的:
clickOn Click: 当用户单击鼠标左键并松开
mouseupOn Mouse Up: 当用户释放鼠标按键
mousedownOn Mouse Down: 当用户按下鼠标按键
doubleclickOn Double-click: 当用户双击鼠标左键
rightclickOn Right-click: 当用户单击鼠标右键并松开
toggleOn Toggle: 当用户单击鼠标左键后,自定义的事件将被执行。用户再次点击后,事件将被还原
mouseoverOn Mouse Over: 当用户鼠标位于所定义区域之上
mouseenterOn Mouse Enter: 当用户鼠标进入所定义区域
mouseenterOn Mouse Leave: 当用户鼠标离开所定义区域
dragstartOn Drag Start: 当用户按住鼠标左键并拖动至少5像素时
dragOn Drag: 当用户按住鼠标左键并保持鼠标移动时
dropOn Drag Stop: 当用户停止移动鼠标并且松开鼠标右键
keyupOn Key Up: 当键盘按键被释放
keydownOn Key Down: 当键盘按键被压下
swipeupOn Swipe Up: 当用户一根手指向上滑动
swipedownOn Swipe Down: 当用户一根手指向下滑动
swipeleftupOn Swipe Left Up: 当用户一根手指向左上方滑动
swipeleftOn Swipe Left: 当用户一根手指向左滑动
swipeleftdownOn Swipe Left Down: 当用户一根手指向左下方滑动
swiperightupOn Swipe Right Up: 当用户一根手指向右上方滑动
swiperightOn Swipe Right: 当用户一根手指向右滑动
swiperightdownOn Swipe Right Down: 当用户一根手指向右下方滑动
pinchopenOn Pinch Open:当用户两根手指互相张开滑动
pinchcloseOn Pinch Close:当用户两根手指收缩活动
rotateleftOn Rotate Left: 当用户两根手指向左旋转滑动
rotaterightOn Rotate Right: 当用户两根手指向右旋转滑动
tapholdOn Tap Hold: 当用户手指按住屏幕超过2秒
orientationportraitOn Orientation Portrait: 当设备由横屏切换为竖屏
orientationlandscapeOn Orientation Landscape: 当设备由竖屏切为横屏
changeOn Change: 当元素的值通过用户的直接操作发生变化时
focusinOn Focus In: 当输入框获得焦点时
focusoutOn Focus Out: 当输入框失去焦点时
pageloadOn Page Load: 当页面加载时
pageunloadOn Page Unload: 当用户离开页面时
举个简单但是有用的例子,当你要实现用户名密码验证的交互效果时,在大多数原型工具中,我们需要对输入框做一些逻辑上的设定,填好其属性中的数值。而在JustinMind中则更为直观:
在交互窗口中,选择条件表达式:
将需要验证的输入框拖拽到相应判断窗口:
将相应的判断逻辑拖拽到判断窗口,例如等号,并在右侧输入框输入需要的值
OK,That’s it !在主界面点击生成,就可以及时预览效果了
关于模板
你可以为页面上的不同组件选择使用不同的模板,从而不改变内容只改变样式,切换起来非常灵活。

总结

JustinMind相比Axure最让人喜爱的4个原因有:
1.Easy Drag and Drop
JustinMind里面对于组件的交互效果有着及其方便的操作方式,点击一个对象,拖动到另一个对象,OK,这两个对象已经产生了交互的碰撞。
2.Powerful Interactions
JustinMind提供了强大的交互效果,鼠标hover的状态、点击后的效果,非常逼真。同时在移动设备上能够高度仿真的实现各种手势效果。
3.Quickly Simulate
JustinMind提供了一键生成,不用再像Axure那样多步操作,点击后直接在浏览器窗口打开。
4.Great Extras
网上有各种各样的组件、模板,可以根据需要选择相应的进行使用。
欢迎加入到我们的Justinmind中文爱好者小组,一起为国内用户奉上各种教程、资源和组件库:http://www.wejustinmind.com/

Subversion 的分支与合并

分支的基本概念就正如它的名字,开发的一条线独立于另一条线,如果回顾历史,可以发现两条线分享共同的历史,一个分支总是从一个备份开始的,从那里开始,发展自己独有的历史(如下图所示)

⑴创建分支
假设目前我们版本库中的项目的布局如下图:

如图所示,我们的项目放在了trunk(主线)目录,另外还有branch(分支)和tags(标签)目录,这样的布局是为了更清晰的区别主线、分支和标签三者的位置。
subversion对分支和标签是通过复制一份最新的版本库的快照来实现的。

开始创建分支:
在我们CheckOut的主线目录(trunk)上,右键点击然后选择“Branch/tag…”

在弹出的窗口中,将To Url 指向branch目录并输入分支的具体目录名,这里是mybranch1.0,我们即将创建的分支便存放于此处,点击OK。

Update一下本地的branch目录,你就可以看到你刚刚创建的分支“mybranch1.0”,这样一来我们的分支就创建完成了。

创建分支的最大的目的就是跟主线进行并行开发的时候不影响主线的开发。
因为你在分支上所做的提交都只存于分支上,主线上的Update是看不到分支的修改的。如下图所示,trunk只能看到r344的版本,并看不到r343的版本。

(什 么时候应该使用分支呢?例如你接到了一个任务,完成这个任务需要三四个人的合作,你们之间需要共享资源,那们就可以创建一个专为这次任务的分 支,参与此次任务的人员则在分支上做开发,等完成之后再合并到主线上,才不会出现将实现了一半的不完成功能也提交到主线上,影响主线的正常工作。又或者自 己需要一个较长的开发周期来完成任务,这么长的时间内如果一直没有将资源进行提交,万一丢失了就前功尽弃了。当然分支不是只用于此类情况,还有其它很多种 情况也能使用分支来达到目的。)
使用分支需要注意,由于长期的独立开发,可能会在合并回主线时出现较多的冲突。所以在支线上开发间期如果发现 主干有更新,而且这个更新有可能将来 跟你产生冲突,那你可以先将主线的内容合并到分支上。已免等到做了大量修改再来更新。(其实此过程跟分支合并到主线上是一样的操作,只是目的地不同。)

例如我们在主线上的版本为3,我们如何将此版本的信息合并到分支上呢?

在分支的根目录上右键点击,选择“TortoiseSVNMerge…”。

在这里我们必需先弄明白一个合并背后的关健概念
合并的过程中发生的所有事:首先两个版本库树的比较,然后将区别应用到本地拷贝.
这个命令是包括三个参数的:
1. 初始的版本树 2.最终的版本树 3一个接收区别的工作拷贝。
弄明白这些概念之后我们继续往下操作。
在弹出的窗口中,选择主线目录和其版本号(初始的版本树),再选择主线目录和最新的版本号(最终的版本树),这里也可以是某一个版本号但应该比初始的版本树的版本号要高,接收区默认为你右键所指的目录,这里是mybranch1.0。

在合并之前我们可以通过点击“Unified diff”,查看两版本树之间所有文件的内容的变化,“diff”显示出有发生变化的文件列表,“dry run”能显示真正合并时的状态信息,但并没有做任何的合并操作。
我们点击“Merge”。

在点击“Merge”,合并后的文件(即对分支上的文件补上了主线上修改的内容),如无冲突则可以在分支上像其它文件一样使用了,如果合并后的内容不满意,可以通过撤销来取消这次的合并操作,前提是未对合并后的文件做提交操作。

分支合并到主线跟从主线上合并内容到分支上类似
不同的是
1、开始的版本库是分支创建的版本
2、结束的版本库是完成所以开发工作之后的版本
3、应用的目的是主线目录

关于转换工作拷贝、标签(标签在Subversion中跟分支是相同原理的,一个不去做任何的修改的分支就是版本库某一时刻的一个快照,相当于为某一个版本做了一个标签)

MAC版本Adobe CS6 大师版下载+破解+永久可升级 P.S.此方法不妨碍你上adobe官网

下载地址:http://kuai.xunlei.com/d/VEGTNIHJHOUK

大师版包括:
Photoshop CS6
Photoshop CS6 Extended
Illustrator CS6
InDesign CS6
Acrobat X Pro
Flash Professional CS6
Flash Builder 4.6 Premium Edition
Dreamweaver CS6
Fireworks CS6
Premiere Pro CS6
After Effects CS6
Audition CS6
SpeedGrade CS6
Prelude CS6
Encore CS6
Bridge CS6
Media Encoder CS6
继续阅读

Dojo与jQuery综合比较分析

最近Dojo 和jQuery双双发布了最新的1.8版本,有着相同版本号的两个Javascript库也有许多核心的相同之处:相同的资源加载机制AMD、相同的选择 器 引擎Sizzle等。作为业界知名的Javascript库,Dojo和jQuery在各自领域有着为数众多的拥护者。不过正所谓一把钥匙开一把锁,对一 个项目来说肯定有个最适合它的工具库,用对了工具才能事半功倍。所以对项目经理或是技术总监来说,工程开始前的技术选型是关键一步,本文将对Dojo和 jQuery最新版本进行一个综合比较,重点在于区分两者的适用场景,而不涉及讨论孰优孰劣。

Licence

Dojo和jQuery都属于活跃的开源项目,并且都使用自由度很高的开源协议,可以免费使用,没有费用和许可问题。Dojo 许可协议为BSD&AFL,jQuery许可协议为MIT&GPL。

继续阅读

PhoneGap开发必备的五件工具

1. 轻量级的JQuery兼容库

JQuery已经成长的得非常强大了,但在移动设备上有些臃肿。如果你的应用只运行在WebKit内核的机器上,那么我强烈建议你换用移动版本的JQuery兼容库。

ZeptoJQ.mobi都是专门为移动设备优化后的JQ兼容库。

Zepto我不是特别熟悉,JQ.mobi我用得比较多,官方提供的数据称,JQ.mobi比JQueryMobile快3倍以上。

相比于JQueryMobile悲催的定导航底导航固定功能,JQ.mobi也提供了自己的UI。虽然和JQM差不多丑,但不会出现万恶的导航栏闪动问题。如果你自己不想构建UI框架,那么还是推荐用JQ.mobi的UI库,换换配色和背景,也能看起来蛮专业的。

另外JQ.mobi还提供了一系列的插件,但是都没有提供文档 。里边的scroll插件不如iScroll4给力,模板插件还可以用。这里讲下用法。

要使用JQMobi的插件,只需要简单的用script载入对应的文件就行。

JQ.Mobi的模板来自这里(这个链接要从源代码中才能翻出来,藏那么好干嘛啊…)是一个使用%号进行标记的系统。

继续阅读