锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Android Studio 0.8.2+ and above, could easily import modules. Thanks to TGMCains answer, is simplified, by using Android Studio itself to import OpenCV as a module. Step (6) is since Android studio expects native libs in OpenCV written is in C/C++. Java wrappers are Waiting for device. Event Log紿楀彛鏄劇ず: NoSuchMethodError: com.android.builder.model.AndroidArtifact.getOutputs()Ljava/util/Collection;: com.android.builder.model.AndroidArtifact.getOutputs()Ljava/util/Collection; 鎶樿吘浜?jiǎn)寰堜? 涓嶅緱瑕侀. 鍚庢潵鎯寵搗Android Studio鏄噰鐢ㄨВ鍘嬪畨瑁呭寘, 騫惰鐩栧師鏈夌洰褰曟柟寮忓崌綰х殑, 閭d箞鍙兘浼?xì)鏄煇涓枃錃g瀛樺湪'鏂版棫鍐茬獊'鐨勫彲鑳? 浜庢槸涓涓釜媯(gè)鏌ユ枃浠剁殑鏃墮棿鎴? 鍙戠幇鍙鍦ˋndroid Studio鐩綍涓嬪垹闄や笅闈?鏃?鏂囦歡, 閲嶅惎鍗沖彲. \android-studio\plugins\android\lib\builder-model-0.11.0.jar 鍥犱負(fù)Android Studio 0.8.1鐨凣radle鐢ㄧ殑鏄?.12.+浜?. // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { // NOTE: Do not place your application dependencies here; they belong allprojects { <---- No Google Service ----> 鍞? 浣曟椂Google Service鎵嶈兘鐣呭揩璁塊棶鍟?..app/src/main/jniLibs
instead of older libs
folder. For those new to Android OpenCV, don't miss below stepsstatic{ System.loadLibrary("opencv_java"); }
]]>
@ResponseBody
public ResponseEntity<Post.Response> post(HttpServletRequest request) {
Post.Response resp = null;
Post.Request req = null;
String file = null;
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if (multipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
try {
Collection<Part> parts = multiRequest.getParts();
boolean hasJSON = false;
boolean hasFile = false;
for (final Part p : parts) {
if (hasJSON) {
continue;
}
if (p.getContentType().contains("application/json")) {
ObjectMapper mapper = new ObjectMapper();
req = mapper.readValue(p.getInputStream(), Post.Request.class);
if (req != null) {
resp = new Post.Response();
resp.setX(100);
hasJSON = true;
}
} else if (p.getContentType().contains("image/jpeg")) {
++ index;
file = UPLOAD_ROOT + String.valueOf(index) + ".jpg";
InputStream is = p.getInputStream();
File localFile = new File(file);
OutputStream os = new FileOutputStream(localFile);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
hasFile = true;
}
if (hasJSON && hasFile) {
break;
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ServletException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
if (req != null && file != null) {
resp = calc.calc(req, file);
}
if (resp != null) {
return new ResponseEntity<Post.Response>(resp, HttpStatus.OK);
} else {
return new ResponseEntity<Post.Response>(resp, HttpStatus.BAD_REQUEST);
}
}
]]>
1. download opencv zip package錛?br /> 2. download cmake source zip錛?br /> 3. download ant binary package錛?br /> 4. install ant binary;
5. make cmake;
6. unzip opencv;
7. cmake opencv source;
#mkdir build
#cd build
#cmake -D BUILD_SHARED_LIBS=OFF ../
#make
8. install opencv library into Maven;
9. update pom.xml to add openvn dependency;
<groupId>org.opencv</groupId>
<artifactId>opencv</artifactId>
<version>2.4.11</version>
<systemPath>/Users/Jie/Downloads/opencv-2.4.11/build/bin/opencv-2411.jar</systemPath>
<scope>system</scope>
</dependency>
10. run webapp;
11. done;
緲諱簡(jiǎn)鏃犳暟++鐨勯〉闈紝灝辮繖浜泘
]]>
{
public:
class TParams
{
public:
TParams(int size);
virtual ~TParams();
private:
TParams(const TParams& params) {}
TParams& operator = (const TParams& params) { return *this; }
public:
void Add(const char* val, int size);
void Add(int val);
void Add(unsigned int val);
void Add(uint64_t val);
void Add(short val);
void Free();
int Size() const { return _size; }
const char * const * Value() const { return value; }
const int* Length() const { return length; }
const int* Format() const { return format; }
public:
char** value;
int* length;
int* format;
private:
int _size;
int _pos;
};
public:
DBConnection()
: conn(NULL)
{
}
virtual ~DBConnection();
public:
int Connect(const char* info);
void Disconnect();
int ExecCmd(const char* cmd);
PGresult* ExecQuery(const char* sql);
int ExecCmdWithParams(const char* cmd, const TParams& params);
PGresult* ExecQueryWithParams(const char* sql, const TParams& params);
int BeginTranscation();
int EndTranscation();
private:
PGconn* conn;
};
: _size(size), _pos(0)
{
value = new char*[_size];
length = new int[_size];
format = new int[_size];
}
DBConnection::TParams::~TParams()
{
Free();
}
void DBConnection::TParams::Free()
{
if (_size == 0)
{
return;
}
for (int i = 0; i < _size; ++ i)
{
if (format[i] == 0)
{
delete[] value[i];
}
else if (length[i] == sizeof(int) || length[i] == sizeof(unsigned int))
{
delete (int*)value[i];
}
else if (length[i] == sizeof(uint64_t))
{
delete (uint64_t*)value[i];
}
else
{
delete (short*)value[i];
}
}
delete[] value, value = NULL;
delete[] length, length = NULL;
delete[] format, format = NULL;
_size = 0;
DEBUG(DEBUG_ANY, "<DBConnection::TParams::Free()>"<< std::endl);
}
void DBConnection::TParams::Add(const char* val, int size)
{
char* char_val = new char[size + 1];
char_val[size] = '\0';
// char* char_val = new char[size];
memcpy(char_val, val, size);
value[_pos] = char_val;
length[_pos] = size + 1;
format[_pos] = 0;
++ _pos;
}
void DBConnection::TParams::Add(int val)
{
#ifdef __OS_MAC__
int* int_val = new (int)(val);
#else
int* int_val = new (int)(htonl(val));
#endif
value[_pos] = (char*)(int_val);
length[_pos] = sizeof(int);
format[_pos] = 1;
++ _pos;
}
void DBConnection::TParams::Add(unsigned int val)
{
#ifdef __OS_MAC__
unsigned int* int_val = new (unsigned int)(val);
#else
unsigned int* int_val = new (unsigned int)(htonl(val));
#endif
value[_pos] = (char*)(int_val);
length[_pos] = sizeof(int);
format[_pos] = 1;
++ _pos;
}
void DBConnection::TParams::Add(uint64_t val)
{
#ifdef __OS_MAC__
uint64_t* uint64_val = new uint64_t(val);
#else
uint64_t* uint64_val = new uint64_t(htobe64(val));
#endif
value[_pos] = (char*)(uint64_val);
length[_pos] = sizeof(uint64_t);
format[_pos] = 1;
++ _pos;
}
void DBConnection::TParams::Add(short val)
{
#ifdef __OS_MAC__
short* int_val = new (short)(val);
#else
short* int_val = new (short)(htons(val));
#endif
value[_pos] = (char*)(int_val);
length[_pos] = sizeof(short);
format[_pos] = 1;
++ _pos;
}
////
DBConnection::~DBConnection()
{
Disconnect();
}
int DBConnection::Connect(const char* info)
{
conn = PQconnectdb(info);
if (PQstatus(conn) != CONNECTION_OK)
{
DEBUG(DEBUG_ANY, "PQ connection failed.");
PQfinish(conn);
return -1;
}
return 0;
}
void DBConnection::Disconnect()
{
if (conn != NULL)
{
PQfinish(conn);
conn = NULL;
}
}
int DBConnection::ExecCmd(const char* cmd)
{
PGresult* res = PQexec(conn, cmd);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
DEBUG(DEBUG_ANY, "<DBConnection::ExecCmd> failed - " << cmd << std::endl);
DEBUG(DEBUG_ANY, "DBConnection::ExecCmd> error - " << PQerrorMessage(conn) << std::endl);
PQclear(res);
return -1;
}
// int ret = ntohl(*PQcmdTuples(res));
int ret = *PQcmdTuples(res);
PQclear(res);
return ret;
}
PGresult* DBConnection::ExecQuery(const char* sql)
{
PGresult* res = PQexec(conn, sql);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
DEBUG(DEBUG_ANY, "<DBConnection::ExecQuery> failed - " << sql << std::endl);
DEBUG(DEBUG_ANY, "DBConnection::ExecQuery> error - " << PQerrorMessage(conn) << std::endl);
PQclear(res);
return NULL;
}
return res;
}
int DBConnection::ExecCmdWithParams(const char* cmd, const DBConnection::TParams& params)
{
PGresult* res = PQexecParams(conn, cmd, params.Size(), NULL, params.Value(), params.Length(), params.Format(), 0);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
DEBUG(DEBUG_ANY, "<DBConnection::ExecCmdWithParams> failed - " << cmd << std::endl);
DEBUG(DEBUG_ANY, "DBConnection::ExecCmdWithParams> error - " << PQerrorMessage(conn) << std::endl);
PQclear(res);
return -1;
}
// int ret = ntohl(*PQcmdTuples(res));
int ret = *PQcmdTuples(res);
PQclear(res);
DEBUG(DEBUG_ANY, "<DBConnection::ExecCmdWithParams> succ - " << cmd << std::endl);
return ret;
// return 0;
}
PGresult* DBConnection::ExecQueryWithParams(const char* sql, const TParams& params)
{
PGresult* res = PQexecParams(conn, sql, params.Size(), NULL, params.Value(), params.Length(), params.Format(), 0);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
DEBUG(DEBUG_ANY, "<DBConnection::ExecQueryWithParams> failed - " << sql << std::endl);
DEBUG(DEBUG_ANY, "DBConnection::ExecQueryWithParams> error - " << PQerrorMessage(conn) << std::endl);
PQclear(res);
return NULL;
}
return res;
}
int DBConnection::BeginTranscation()
{
return ExecCmd("BEGIN");
}
int DBConnection::EndTranscation()
{
return ExecCmd("END");
}
]]>
OSX鍗囩駭鍒?0.10.1鍚庯紝紿佺劧鍙戠幇鍦∣SX涓嬬湅涓嶅埌Bootcamp璁懼浜?jiǎn)銆傛兂鏉ヨ繖鍗婁釜鏈堝氨鐢ㄨ繃涓夋Win8.1錛岃屼笖涔熸病鍋氬暐榪囧垎鐨勬搷浣滐紝鎬庝箞灝辯湅涓嶈浜?jiǎn)鍛㈠Q?br />
鎶樿吘涓涓嬪崍錛岃繕鏄病鏈夋悶瀹氾紝浣嗗彂鐜頒竴鐗囧ソ鏂?a >https://discussions.apple.com/thread/4871585錛屽叾浠栨彁鍒扮殑闂璺熸垜榪欎竴鏍鳳紝寰堟槸嬈㈠枩銆?br />
“The problem is that the tool you used to resize the NTFS volume updated the MBR but didn't update the GPT. OS X only uses the GPT, and since the partition is invalid in the GPT, the NTFS volume doesn't mount. ”
娌$湅澶槑鐧斤紝鎰忔濆簲璇ユ槸MBR璺烥PT涓嶄竴鑷翠簡(jiǎn)銆?br />
涓嬮潰鏄甯哥殑gpt鏁版嵁錛?br />
gpt show: disk0: mediasize=1000204886016; sectorsize=512; blocks=1953525168
gpt show: disk0: Suspicious MBR at sector 0
gpt show: disk0: Pri GPT at sector 1
gpt show: disk0: Sec GPT at sector 1953525167
start size index contents
0 1 MBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
409640 1451847864 2 GPT part - 48465300-0000-11AA-AA11-00306543ECAC
1452257504 1269536 3 GPT part - 426F6F74-0000-11AA-AA11-00306543ECAC
1453527040 499996672 4 GPT part - EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
1953523712 1423
1953525135 32 Sec GPT table
1953525167 1 Sec GPT header
榪欎釜鏄湁闂鐨勶細(xì)錛堟垜鑷繁鐨勫繕璁拌褰曚簡(jiǎn)錛岃繖閲屾槸copy鏂囩珷閲岄潰鐨勶級(jí)
gpt show: disk0: mediasize=500107862016; sectorsize=512; blocks=976773168
gpt show: disk0: Suspicious MBR at sector 0
gpt show: disk0: Pri GPT at sector 1
gpt show: disk0: Sec GPT at sector 976773167
start size index contents
0 1 MBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
409640 586340368 2 GPT part - 48465300-0000-11AA-AA11-00306543ECAC
586750008 1269536 3 GPT part - 426F6F74-0000-11AA-AA11-00306543ECAC
588019544 168
588019712 144130048 4
732149760 244623360 4 GPT part - EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
976773120 15
976773135 32 Sec GPT table
976773167 1 Sec GPT header
鍙互鍙戠幇GPT鏁版嵁涓嶈繛緇紝瀵艱嚧緋葷粺鏃犳硶姝e父mount鍒嗗尯銆?br />
闂鏄繖鏍鳳紝浣嗘垜鎼炰笉鎳傛枃绔犱腑鐨勪慨澶嶆柟寮忥紝鏈涙枃鍏村徆浜?jiǎn)鍗婂ぉ銆傚拷鐒舵兂璧鳳紝鏃㈢劧鏄鐩樺垎鍖哄鑷寸殑闂錛岄偅閲嶆柊鍒嗗尯璇ュ氨濂戒簡(jiǎn)銆備簬鏄氨騫茶搗鏉ャ傘傘?br /> 褰撶劧鎴戜笉鑳藉垹闄ゅ師鏉ョ殑Bootcamp錛岄偅涓婅繕鏈夊緢澶氬悓瀛﹁鐨凜#浠g爜鍛€傛墍浠ュ憿錛岃蛋涓梺閬?-- 鐢―iskUtil鍏堜粠鍘熸潵Machintosh HD鍒嗗尯鍐嶅垝鍒嗕釜灝忓垎鍖烘潵錛岀劧鍚庡啀鍒犻櫎鎺夎繖涓皬鍒嗗尯錛岃繖鏍風(fēng)郴緇熷氨浼?xì)閲嶆柊鍒锋柊鍒嗗尯鏁版嵁銆?br /> 緋葷粺閲嶅惎, sudo mount -t ntfs /dev/disk0s4 /Volumes/BOOTCAMP, 浜庢槸鎴戝張鐪嬭浜?jiǎn)鎴戠殑BOOTCAMP璁懼浜?jiǎn)銆俠ingo錛屾悶瀹氫簡(jiǎn)銆傘傘?br />
<---- 鍥炲ご鍐嶈鐨勫垎鍓茬嚎 ---->
榪欐鏃ュ瓙錛屽緢闀跨殑涓孌墊棩瀛愯繃鍘諱簡(jiǎn)錛屽彧鏄粖澶╄繕鏄病蹇?jī)鎯呭仛涓鏄庡Q屼笅嬈″惂銆傘傘傚彲浠ヨ鐨?--- 鎴戜緷鐒跺鏂楀湪鏁插瓧鐨勭涓綰褲?br />
]]> 鏄ㄥぉ灝咥ndroid Studio鍗囩駭鍒?.8.1, 绔熺劧娌℃硶鎵цApp浜?jiǎn)~
Run紿楀彛涓樉紺?
Target device: lge-nexus_4-0262fa6d9d51c2e8
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
// in the individual module build.gradle files
}
}
repositories {
mavenCentral()
}
}
]]>
鏃╀笂寰堟剰澶栧湴鏀跺埌涓涓暀璦, 璇存槸闇瑕丩AC (LingosHook Android Client)鍜屾暟鎹枃浠? 涓嶇煡澶у鏄惁榪樿寰楄繖涓? LAC鏁插畬鍙戝竷閮藉凡緇忚繃鍘諱袱騫翠簡(jiǎn), 鎬庝箞浣跨敤鐪嬭繖閲?/a>, 闇瑕佺殑灝辮繖閲屼笅杞戒簡(jiǎn).
c46.db3 - http://1drv.ms/1r436SDLAC.apk - http://1drv.ms/VzfFso
榪戞鏃墮棿Google鐨勬湇鍔¢兘涓嶅彲璁塊棶, 鎴戞妸榪欎袱涓枃浠墮噸鏂頒紶鍒癘neDrive涓婁簡(jiǎn), 騫墮殢鎵嬫妸鍏朵腑鐨勫箍鍛婄粰鍒犱簡(jiǎn), 鍞? 鍙嶆鍦ˋndroid涓婁竴鐐歸摱瀛愪篃瑙佷笉鍒? 绱㈡х湡闇瑕佺殑灝辨嬁鍘誨惂...
鍞? 瀹為檯閮藉繕璁拌繖涓狶AC浜? 鎯蟲兂鑷繁鍦ˋndroid涔熸暡浜?jiǎn)涓夠q村崐浜? 搴旂敤, 娓告垙鏁蹭簡(jiǎn)鍑犱釜, 浣嗙幇鍦ㄦ兂鎹喚璺烝ndroid鐩稿叧鐨勫伐浣滅珶鐒舵棤鏈? 鍚勭闃村樊闃抽敊瀵艱嚧鎬繪誨け璐? 鐪嬫潵杞榪樻槸涓嶅鍦?..
鍛ㄦ湯鍚屽璇存兂寮勪釜鍩轟簬Baidu鍦板浘鐨勫簲鐢? 浜庢槸灝卞紑濮嬬爺絀惰繖涓猄DK鏉? 鍏朵腑搴旂敤鏈変釜闇姹? 闇瑕佺偣鍑誨湴鍥句笂鐨勬爣璁版椂, 鏄劇ず涓緇勬寜閽? 浜庢槸鎸夌収甯歌鐨勪綔娉曞け涓氫簡(jiǎn)InfoWindow, 濡備笅.
//panel is a view, some buttons in it. final InfoWindow iw = new InfoWindow(panel, marker.getPosition(), null); //getMap() return BaiduMap activity.getMap().showInfoWindow(iw);
鍊掓槸涓嶉毦, 浣嗗鐞嗙偣鍑諱簨浠舵椂鍙戠幇鏈夐棶棰樹簡(jiǎn). 鏍規(guī)嵁鏂囨。, 姝ゆ椂鏄劇ず鍑烘潵鐨処nfoWindow瀹為檯鏄疺iew鐨凚itmap鍥劇墖, 涔熷氨鎰忓懗鐫鏍規(guī)湰娌℃硶鍖哄垎View涓婄殑Buttons浜? 鏇村埆璇磋兘澶勭悊Button鐨勭偣鍑諱簨浠朵簡(jiǎn). 鎬笉寰? 鏂囨。涓浜庢暣涓狪nfoWindow鍙湁涓涓狢lickListener, 榪樹笉鍚湁View淇℃伅.
榪欐牱鍙兘"鏇茬嚎鏁戝浗"浜? InfoWindow涓嶈兘鐢? 閭e氨鐩存帴鍦∕apView涓脊鍑轟釜PopupWindow鍚? (欏烘墜鏁叉墦嫻嬭瘯浠g爜, 灝辮褰曠敤)
final View panel = UserPanel.make(activity); Point p = activity.getMap().getProjection().toScreenLocation(marker.getPosition()); final PopupWindow pw = new PopupWindow(panel); pw.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); pw.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); pw.setFocusable(true); pw.setOutsideTouchable(true); //getMapView() return MapView, not BaiduMap any more pw.showAtLocation(activity.getMapView(), Gravity.LEFT | Gravity.BOTTOM,p.x, p.y ); final Button btn = (Button) panel.findViewById(R.id.button2); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { pw.dismiss(); } });
鎼炲畾,浜洪暱涓剳琚嬫繪槸鏈夌敤鐨?..
嫻嬭瘯涓彂鐜頒釜闂, 濡傛灉鍦板浘鍙戠敓鏀劇緝, Window寮瑰嚭鐨勪綅緗細(xì)涓嶅噯紜? 寰堟槸濂囨? 鎸夌悊MapView鍙戠敓鍙樺寲鏃? 鍏禤rojection搴旇鑳藉瀹炴椂璺熼殢鍙樺寲鐨? 榪欎釜闂鍥炲ご闇瑕佸啀鐪嬬湅.
<---- 鍥炶繃澶寸殑鍒嗗壊綰?---->
浣嶇疆涓嶅噯紜殑闂鏄敱浜嶸iew鍜孲creen鍧愭爣緋諱笉鍚? 浠ュ強(qiáng)MapView鑷韓size鍏卞悓褰卞搷鐨? 閿欐簡(jiǎn)Projection浜?.
浠婂ぉ紿佺劧縐佷俊闂?I;P鎬庝箞闅愯棌鐨勭郴緇熻櫄鎷熼敭'鐨? 鏍峰瓙灝卞涓嬪浘(瀵規(guī)瘮).
鍙互鐪嬪埌涓変釜緋葷粺铏氭嫙閿彉鎴愪笁涓瀬灝忕殑鐐逛簡(jiǎn). 瀹為檯I;P騫舵病鏈夎揪鍒?闅愯棌'鐨勬晥鏋? 榪欏簲璇ュ彧鑳界畻鏄?寮卞寲'. 鍘熷洜鍚? 寮濮嬫垜娌℃悶瀹?闅愯棌', 鍚庢潵鎯崇潃濡傛灉鐪熼殣钘忎簡(jiǎn), 鐢ㄦ埛鎬庝箞鎿嶄綔緋葷粺鎸夐挳鍟? 鎵浠? '寮卞寲'瀵逛簬I;P涔熷氨澶熶簡(jiǎn)...榪欎釜涓鐐逛笉闅? 鍦╨ibgdx鐨凙ndroidApplication鐨凮nCreate()涓偣鍑誨涓嬩唬鐮佸嵆鍙?
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration(); cfg.useGL20 = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { WindowManager.LayoutParams params = getWindow().getAttributes(); params.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN;
getWindow().setAttributes(params); } initialize(new IPGame(setup, playService), cfg); }
'璞嗙摚闃呰'榪欎釜app鍋氬埌浜?jiǎn)闅愯? 涓嶇煡濡備綍鍋氬埌鐨? 鍥犱負(fù)鏍規(guī)嵁Android瀹樻柟鏂囨。涓婄殑鍐呭鐪? 榪欎釜鏄笉寮鏀劇殑. 寰堟槸濂囨? 鍥炲ご鍐嶈瘯璇曞惂..
鏅氫笂鏌ョ湅涓孌佃祫婧恱ml鏂囦歡鏃? 鍙戠幇View绔熺劧鏈変釜'android:onClick'灞炴?..榪欏お'闇囨儕'浜?..
鍒氬紑濮嬫暡Android鏃? 灝辨兂榪囪繖涓棶棰?-- android鎶婅祫婧愭枃浠剁敤鐨勫姝ょ伒媧? 涓哄暐View鎺т歡涓嶈兘鍦ㄨ祫婧愭枃浠朵腑鐩存帴瀹氫箟鍚勭被浜嬩歡鍥炶皟鍑芥暟鍛? 鍚庢潵鏁插浜? 鍙戠幇濡傛灉鐩存帴鍦ㄨ祫婧愭枃浠朵腑瀹氫箟浜嬩歡澶勭悊灞炴? 榪欎細(xì)闄愬埗璧勬簮鏂囦歡鐨勪嬌鐢? 鍍忔槸鍚屼竴浠借祫婧愭枃浠跺鏋滆涓や釜涓嶅悓鐨凙ctivity浣跨敤, 閭e氨蹇呴』鍚勮嚜鍐欎竴涓簨浠跺洖璋冨鐞嗗嚱鏁? 濡傛灉娌℃湁, 涓鏃︿簨浠惰瑙﹀彂, 閭e氨鏄紓甯稿晩; 鍙﹀, 濡傛灉璧勬簮鏂囦歡琚竴涓狥ragment浣跨敤, 涓斿湪Fragment瀹炵幇浜?jiǎn)浜嬩欢澶勭悊鍑芥? 閭e綋Fragment鍔犲叆鍒癆ctivity鍚? 鎬曠郴緇熷氨鎵句笉鍒拌繖涓嚱鏁頒簡(jiǎn). 鍥犳, 瑙夊緱娌℃湁'android:onClick'榪欐牱鐨勫睘鎬ц鏄甯哥殑, 鍚庨潰涔熷氨娌″啀鎯寵繃榪欎釜浜? 姣忔閮藉緢鑰佸疄鐨勪嬌鐢╒iew.setOnClickListener()浜?..
浣? 鐜板湪榪欎釜灞炴х珶鐒剁湡鏄瓨鍦? 鑰屼笖涓鐩撮兘鍦? 榪欏お璁╂垜'宕╂簝'浜?..閭f劅瑙夊氨鍍忚蛋鍦ㄥぇ琛椾笂, 紿佺劧鐪嬪埌鏈変漢鍦ㄩ仜 --- 鎭愰緳涓鏍?..
浜庢槸, 璧剁揣鍐欎簡(jiǎn)浠g爜嫻嬭瘯浜?jiǎn)涓媬
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onButtonClick" android:text="Button" />
public void onButtonClick(View view) { Log.d(Tag, "onButtonClick()"); }
鏋滅劧濂界敤...浣嗙獊鐒舵兂鍒? 濡傛灉榪欎釜璺烿iew.setOnClickListener()鍏卞瓨鏃? 璋冪敤榪囩▼璇ユ槸濡備綍鍛?
Button btn = (Button) this.findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d(Tag, "onClickListener - onClick()"); } });
嫻嬭瘯緇撴灉鏄?OnClilckListener()涓殑onClick()浼?xì)琚皟鐢? 鑰宎ndroid:onClick瀹氫箟鐨刼nButtonClick()瀹屽叏琚拷鐣ヤ簡(jiǎn).
灝卞鍓嶉潰鎻愬埌鐨? 榪欑灞炴ц緗殑鏂瑰紡鏈変簺緙洪櫡, 榪樻槸浣跨敤setOnClickListener()姣旇緝鍙帶闈犺氨, 褰撶劧濡傛灉鍦ㄥ竷灞鏂囦歡浣跨敤姣旇緝鍥哄畾鐨勬儏鍐典笅, 榪欑灞炴у畾涔夋柟寮忕‘瀹炲彲浠ュ皯鏁插緢澶氫唬鐮?
鍩轟簬嫻嬭瘯緇撴灉, 紿佺劧'鎶栨満鐏?鍦版兂鍒頒竴孌典唬鐮佹潵 -- 濡傛灉鍦╫nButtonClick()涓皟鐢╯etOnClickListener()浼?xì)鎬庢牱鍛?
public void onButtonClick(View view) { Log.d(Tag, "onButtonClick()"); Button btn = (Button) this.findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d(Tag, "onClickListener - onClick()"); } }); }
榪欐牱絎竴嬈$偣鍑?yán)L椂, 鎵цonButtonCllick(), 騫跺皢View鐨勭偣鍑諱簨浠跺鐞嗛氳繃setOnClickListener()浼犲埌OnClickListener()涓? 褰撳啀嬈¤鐐瑰嚮鏃? 灝變細(xì)鎵цonClick()浜? 榪欏氨鍙互瀹炵幇涓縐嶉渶姹?-- 鐐逛竴嬈℃病浜? 鍐嶇偣灝卞穿婧?..鏍規(guī)湰涓嶇敤鍔犱粈涔堝垽鏂彉閲忓拰璇彞浜? 鍢垮樋, 澶?鏈烘櫤'鍟?..
<---- 鎷栧歡鐥囦篃浼?xì)迤堝彂鐨勫垎鍓簿U?---->
榪戞鏃墮棿, 鍚勭鍊熷彛瀵艱嚧鍚勭鎷栧歡鐥囧茍鍙? 浣垮緱SnakeGo鏁茬殑鐢氭槸緙撴參..涓嶈〃浜?..
鏄ㄦ櫄鎶夿aseScreen灝辨暡濂戒簡(jiǎn), 涔熸壘鍒頒簡(jiǎn)灞忓箷鏀劇緝鐨勬渶浼樺拰鏈綆鏂瑰紡. 涓嶅璇? 鐪嬩唬鐮?
public BaseScreen(final SnakeGo game) { super(new ScalingViewport(Scaling.fit, CommonConsts.Screen.WIDTH, CommonConsts.Screen.HEIGHT, new OrthographicCamera()), new SpriteBatch()); this.game = game; Gdx.input.setInputProcessor(this); }
BaseScreen鐩存帴緇ф壙涓嶴tage鏄釜濂芥柟娉? 寰堟柟渚夸嬌鐢⊿tage鎵鎻愪緵鐨勫悇縐嶆覆鏌?杈撳叆鐩稿叧鐨勫嚱鏁? 浣嗚繖鏍峰鏋滆冭檻MVC椋庢牸鐨勮瘽, M鍜孋浼間箮灝變笉璇ュ湪Screen瀛樺湪, 浣嗗嵈鍙堟病鍦版柟鏀劇疆...褰撶劧榪欐牱鍙兘鏈変簺姝昏剳絳嬩簡(jiǎn). (鎴戝湪Snake瀵硅薄涓垎紱諱簡(jiǎn)M鍜孋).
鍦ㄦ瀯閫犲嚱鏁頒腑, 浣跨敤Scaling鐨刦it鏂瑰紡鏉ュ垵濮婼tage, 鍙互淇濊瘉灞忓箷'灞呬腑鏀劇緝', 騫跺湪resize()鏃? 鏇存柊灝哄鍗沖彲.
@Override public void resize(int width, int height) { this.getViewport().update(width, height, true); }
榪欐柟娉曟湁浜涚畝鍗曠殑璁╀漢涓嶆暍鐩鎬俊...
<---- LIBGDX灝忎紬鐨勫垎鍓茬嚎 ---->
榪欎袱澶╃暀鎰忎簺Game鐩稿叧鐨勬嫑鑱樹俊鎭? 鍙戠幇Libgdx鐪熸槸灝忎紬鍟? 涓涓兘娌℃湁, 闅鵑亾鐪熺殑鍍忔湅鍙嬭鐨?-- "涔熷氨浣犺嚜宸辯帺鐜╁惂...". LIBGDX鐩稿姣旇緝'娼?, 鐢ㄨ搗鏉ヨ櫧璇存湁浜?澶嶆潅', 浣嗗浜庣爺絀朵釜'鏋舵瀯'浠涔堢殑, 鐪熺殑寰堜笉閿欑殑....鍞? 闅鵑亾鎴戜篃杞悜cocos2d-x鍘?
鍒氭墠浣跨敤LIBGDX鐨凷tage鏃? 鍙戠幇1.0.1璺?.99鐨勪竴涓彉鏇?-- Stage鍐呯疆Camera鍜孷iewport(濂界敤鐨凷calingViewport綾?. 濡傛榪欐牱, 閭f斁緙╁睆騫曟洿鏂逛究浜?..
@Override public void resize(int width, int height) { Vector2 size = Scaling.fit.apply(CommonConsts.Screen.WIDTH, CommonConsts.Screen.HEIGHT, width, height); this.getViewport().update((int)size.x, (int)size.y, true);
// Vector2 screenScaling = new Vector2((size.x / CommonConsts.Screen.WIDTH), (size.y / CommonConsts.Screen.HEIGHT)); // this.getRoot().setScale(screenScaling.x, screenScaling.y); }
Stage鍐呯疆鐨凜amera鍜孷iewport鎶?鍘熺偣'鏀懼湪宸︿笅瑙? 鑰屼笉鏄父浣跨敤鐨?灞呬腑', 鍙﹀榪欎釜榪樻湁涓棶棰? 褰撳睆騫曠緝鏀炬椂, Viewport涔熶笉鏄竴鑸範(fàn)鎯?灞呬腑'鏄劇ず, 涔熸槸鏄潬宸︿笅. 鎴戠畝鍗曟煡鐪嬩簡(jiǎn)涓嬬浉搴旂殑Viewport綾? 娌℃湁鍙戠幇濡備綍璁劇疆榪欎釜鍋忕Щ閲? 鍙槸SnakeGo'绔栧睆'妯″紡鍦∟4涓婃濂?閾烘弧', 榪欎釜闂鍐嶈鍚? 濡傛灉闇瑕? 鑳介浼版渶楹葷儲(chǔ)鐨勫氨鏄噸杞絊calingViewport綾諱簡(jiǎn).
浠g爜涓? 鍚庨潰娉ㄩ噴鎺夌殑涓ゅ彞鏄敤浜庣瓑姣斾緥鏀劇緝鍥懼艦鐨? 榪樻病璁ょ湡綆楄繃, 浼間箮涓嶉渶瑕佷篃鍙互鐨? 闇瑕佸啀鐪嬬湅Viewport綾?.
鏁蹭簡(jiǎn)鍑犳櫄SnakeGo, 鍘熷瀷鍑烘潵浜? 澶у鏉ョ湅鐪嬩笉...
涓嶉敊, 榪欒揣灝辨槸---璐悆铔?..鍝堝搱...鍒? 榪欒繕鏄師鍨? 濂界帺鐨勫湪鍚庨潰鍛?..(浠ユ垜鏁插瓧閫熷害, 澶х害鍐嶇瓑涓嶅埌鍏釜鏈堝簲璇ュ彲浠ュ畬鎴愪簡(jiǎn)...)
浠婂ぉ榪欓噷璁板綍涓嬩嬌鐢↙IBGDX榪囩▼涓鍒扮殑涓や釜闂:
1. 璋冩暣灞忓箷姣斾緥;
2. 縐誨姩瑙傚療闀滃ご;
涓, 璋冩暣灞忓箷姣斾緥
LIBGDX鏄法騫沖彴鐨? 涓澶уソ澶勫氨鏄洿鎺ュ湪PC涓婃祴璇? 閭f槸闈炲父鐨勬柟渚? 浣嗚繖鏈変袱涓棶棰橀渶瑕佽冭檻, 涓, 鎵嬫満鏄?280x768, 浣嗘垜PC鍙湁1280x1024鐨? 鑰屼笖鐪熻寮涓窡鎵嬫満涓鏍峰ぇ灝忕殑涓鏍峰ぇ灝忕殑灞忓箷, 閭h繕鎬庝箞鐪媗og杈撳嚭鍛? 浜屽氨鏄笉鍚岀殑鎵嬫満鏈夌潃涓嶅悓鐨勫垎杈ㄧ巼, 闀垮姣斾篃涓嶄竴鑷? 閭f庝箞淇濊瘉鍥懼艦涓嶅彉褰㈠憿?
榪欎釜闂涓嶉毦瑙e喅, 鍙渶瑕佸湪灞忓箷灝哄鍙戠敓鍙樺寲鏃? 鍗硆esize()(絎竴嬈″惎鍔ㄤ篃浼?xì)璋冪敤姝ゅ嚱鏁?涓? 閲嶆柊璋冩暣闀滃ご(Camera)鐨勫弬鏁板嵆鍙? 濡備笅浠g爜:
@Override public void resize(int width, int height) { Vector2 size = Scaling.fit.apply(WIDTH, HEIGHT, width, height); camera = new OrthographicCamera(size.x, size.y); camera.update(); batch.setProjectionMatrix(camera.combined); int viewportX = (int)(width - size.x) / 2; int viewportY = (int)(height - size.y) / 2; int viewportWidth = (int)size.x; int viewportHeight = (int)size.y; Gdx.gl.glViewport(viewportX, viewportY, viewportWidth, viewportHeight); super.resize(width, height); }
榪欓噷閲囩敤鐨勬槸閲嶆柊鍒涘緩camera瀹炰緥鐨勬柟寮? 鍙﹀鐢ㄦ敼鍙樺凡鏈塩amera瀹炰緥鐨勫弬鏁版柟寮忎篃鏄竴鏍風(fēng)殑. 寰堢畝鍗? 鑰屼笖榪欐牱涓嬈″氨瑙e喅浜?jiǎn)涓婇潰涓や釜闂?-- PC鏈轟笂浣跨敤浠諱綍灝哄鐨勭獥鍙? 閮藉彲浠ヨ幏寰楄窡璁劇疆絳夋瘮渚嬬殑紿楀彛, 鎵嬫満涓婁害鏄姝? 鍍?a href="http://www.shnenglu.com/codejie/category/20828.html">I;P灝辨槸閲囩敤鐨勮繖縐嶆柟寮忔潵淇濇寔鍏跺湪浠繪剰鎵嬫満涓婇兘鏄?280:768鐨勬瘮渚?
榪欑鏂規(guī)硶鍙槸鏀瑰彉浜?瑙嗗浘'鐨勫ぇ灝? 浣嗗茍涓嶄細(xì)鏀瑰彉鍏朵腑鐨勫浘褰㈢殑澶у皬, 榪欐牱涓轟簡(jiǎn)淇濇寔鍥懼艦鏄劇ず姣斾緥, 闇瑕佸湪杈撳嚭鍥懼艦鏃跺仛鐩稿簲鐨勬瘮渚嬫斁緙? 鍙互鍦╮esize()鑾峰緱榪欎釜姣斾緥, 鏌撳湪鍥懼艦杈撳嚭鏃朵嬌鐢ㄨ繖涓瘮渚?
screenScaling = new Vector2((size.x / WIDTH), (size.y / HEIGHT));
... ... batch.draw(img, (- WIDTH / 2) * screenScaling.x, (- HEIGHT / 2) * screenScaling.y, WIDTH * screenScaling.x, HEIGHT * screenScaling.y);
浜? 縐誨姩瑙傚療闀滃ご
鍦⊿nakeGo涓? 涓轟簡(jiǎn)涓嶈Snake'璺戝嚭'灞忓箷, 闇瑕侀暅澶碿amera璺烻nake鏈韓淇濇寔'鍚屾'縐誨姩, 榪欐牱鐪嬭搗鏉nake淇濇寔鍦ㄥ睆騫曠殑涓棿, 浣嗗叾瀹僌bject鏄Щ鍔ㄧ殑. 鏍規(guī)嵁'鐩稿榪愯'鍘熺悊, 浣挎暣涓湅璧鋒潵鍍忔槸Snake鍦∣bject涓┛琛? 鎵浠? 縐誨姩camaera鏄繀欏葷殑, 浠g爜涔熺畝鍗? 濡備笅:
...
final OrthographicCamera camera = game.getCamera();
camera.translate(0.0f, 32.0f, 0.0f);
camera.update();
game.getSpriteBatch().setProjectionMatrix(camera.combined);
...
<----蹇?jī)鐑?chǔ)鎰忎貢鐨勫垎鍓茬嚎---->
榪欏嚑澶╁湪鎵懼伐浣? 鍓嶉潰鍘婚潰浜?jiǎn)涓嬈? 鍏朵腑娌′竴涓狝pp鎴栬匞ame鐨勯棶棰? 鍊掑叏鏄疌++鐩稿叧鐨? 鐧繪椂灝卞偦鐪間簡(jiǎn)...铏借鍜變篃鏄疌++'鍑鴻韓'鐨?涓嶇劧Blog涔熶笉浼?xì)鍦q欓噷涓嶆槸), 浣嗕篃璁哥湡鐨勬槸'鑰?浜? 鎵嶄笁騫翠笉鐢–++,绔熺劧蹇樿鐨勫彧鍓╀笅涓猘uto_ptr浜?..鏇存?zhèn)插墽鐨勬槸鍜辩敤鐨凜++98鏍囧噯宸茬粡鍙樻垚C++11浜? auto_ptr鍙樻垚smart_ptr浜?..
閮借鐜板湪鏄釜'璺ㄧ晫'鐨勬椂浠? 浣嗗挶榪欒繕娌℃湁璺ㄧ晫, 鍙槸鍚岃杞釜鏂瑰悜鑰屽凡, 涓哄暐灝辮繖涔堟?zhèn)插墽浜?jiǎn)...濂藉惂, 浼拌瀛﹁壓涓嶇簿鎵嶆槸鏍規(guī)湰...
鍚屽"'澶ф暟鎹?鐨勫崥澹?鍛ㄤ簲鏉ョ數(shù), 闂垜瑕佷笉瑕佽窡濂逛竴璧峰仛涓?鍥懼儚鎼滅儲(chǔ)', 鏈変簺鐘硅鮑, 瑕佽涓夊勾鍓? 涔熻灝卞共浜? 浣嗙幇鍦?..鍐嶈漿嬈″槢...
鎭伴;P鏁插畬, 蹇?jī)鐑?chǔ)鎰忎貢鐨勪竴鍛? 鍙ソ璧剁揣鎶撹搗SnakeGo鏉? 澶滃鐤暡, 鏉ュ畨鎶氱牥鐮拌簛鍔ㄧ殑蹇?..鏄殑, 鑷沖皯鏁插瓧鍙互璁╄嚜宸卞鉤闈?rùn)浜?..
鍚愭Ы鑰屽凡, 榪欓噷鎯寵 ---- 紼嬪簭鍛樹滑鍟? 杞瑕佽秮鐫騫磋交璧剁揣鍟?..
SnakeGo鐨勫熀鏈ā鏍峰湪鑴戣涓嬀鐢葷殑宸笉澶氫簡(jiǎn), 鐜板湪闇瑕佹斁鍒?灞忓箷'涓婄敾涓師鍨嬪嚭鏉ヤ簡(jiǎn), 浣嗙獊鐒跺氨蹇樿璇ユ庝箞鐢╨ibgdx妗嗘灦鏉ョ敾浜?..
鏁插畬I;P榪欐墠鍑犲ぉ鍟?..璧剁揣鎵撳紑宸ョ▼鍐嶇湅, 灝辨兂璧蜂互鍓嶈窡浜鴻榪?-- "libgdx涓嶈兘鍙?寮曟搸', 欏跺鏄竴涓?綾誨爢'", 鏄晩, libgdx浼間箮灝辨病涓浐瀹氱殑鏋跺瓙鍢?.. 浣跨敤涓? 鐢ㄨ搗libgdx鏉ョ湡鐨勬槸瑕佷笢鎷胯タ鍑? 鎸夌収鍏朵腑鍚勭被鐨勫姛鑳? 鑷繁鏉ユ惌寤鴻嚜宸辯殑妗嗘灦... 浜庢槸, 瓚佺潃鑴戣榪樼儹, 璧剁揣鐢諱簡(jiǎn)涓嬮潰鐨勭被鍥? 鐪佺殑鍙堝繕璁?..
濡備綍, 涔變笉?
BaseScreen鐢ㄥ埌鐨凷creenCanvas鍜孉ctorStage鍔熻兘鏄浉鍚岀殑, 鍙槸鍓嶈呯敤浜庢斁緗甋prite, 鑰屽悗鑰呯敤浜庢斁緗瓵ctor/Group; 綆鍗曡, ScreenCanvas閲岄潰鏀劇殑鏄?鑳屾櫙鍥?璐村浘', 鑰孉ctorStage鏀劇疆鏄彲浠ュ搷搴擳ouch鐨凙ctors.
Screen涓嬮潰鐨凪anager鍜孯ender鍦ㄦ瘡涓猄creen瀹炰緥閲岄潰閮芥湁涓濂楃殑, 鍓嶈呯敤浜庡瓨鏀懼拰澶勭悊'鏁版嵁', 鑰孯ender鍒欐牴鎹墠鑰呯殑鏁版嵁鏉ユ覆鏌撶晫闈? 涓ょ涔嬮棿閫氳繃鐩鎬簰娉ㄥ唽鐨凩istener鏉ヤ氦鎹㈡暟鎹拰浜嬩歡. 榪欐灦瀛愬儚涓嶅儚MVC椋庢牸? 鍢垮樋...
鑰佺埛瀛愬績(jī)涓嶈? 渚濈劧鍦ㄥ嫟鍕ゆ伋鎭沖湴鏁茬潃涔﹀拰浠g爜...娌¢敊, 灝辨槸source code. 鍍忚佺埛瀛愯繖鏍風(fēng)殑鑰佷竴杈堜細(xì)鐢ㄧ數(shù)鑴戠殑閮戒笉澶? 鑰屾垜浜茬埍鐨勮佺埛瀛愰偅鏄細(xì)Turbo Basic鐨勯《灝栭珮鎵嬪晩...姣忔鎯沖埌榪欎釜, 鍐呭績(jī)閮藉嶆劅鑷豹...
褰撳勾鐨?紿楀彛"緙栫▼鏋佸叾綣佺悙, 濡傛灉涓嶇湅鐪嬮偅涓濂?lt;Win32 API澶у叏>, 鍐嶅姞涓婁釜<Visual C++鎶鏈唴騫?gt;, 閮戒笉淇濊瘉鑳芥暡涓猈indow鍑烘潵, 浠涔圚WND, hInstance, 浠ュ強(qiáng)涔變竷鍏碂鐨勫悇綾葷獥鍙e拰娑堟伅鐨剆truct...鍙嶆鎴戞槸鏃╂棭灝卞繕鍏夊厜浜?..鎯蟲兂鐜板湪鍦ㄧ殑Android涓婂紕涓?紿楀彛"鍑烘潵, 閭?閭g湡鏄?澶皬鍎跨"浜?..
鍛? 璺戣繙浜?..鎴戞剰鎬濇槸 ---- 鑰佺埛瀛愭姝ヤ簬Windows緙栫▼, 鍚勭被浠g爜鍏ㄩ儴榪愯鍦―OS涓? 闅忕潃Windows鐨勪笉鏂敼榪? 緇堜簬, Windows涓嬪啀涔熶笉鑳借繍琛岃佺埜鎵嬩腑鐨勬棤鏁岀鍣?-- Turbo Basic浜?..
鏇捐窡鑰佺埛瀛愯榪? 灝嗕粬鐨勪唬鐮侀兘縐昏嚦鍒癆ndroid涓? 浣嗚佺埛瀛愪笉鍚屾剰, 鍥犱負(fù), 浠栬佷漢瀹惰繕瑕佹敼浜涘弬鏁扮殑, 鏀逛簺鍙傛暟, 浜涘弬鏁? 鍙傛暟...鐪嬬潃鑰佺埛瀛愬湪Win7涓婅涓猇M璺慩P鍐嶆墦寮Command紿楀彛榪愯Turbo Basic, 鐢氭槸杈涜嫤. 浣滀負(fù)鐭ュ師鐞? 浼?xì)Google鐨勭▼搴忓憳鎴戞潵璇? 甯佺埛瀛愬紕涓狣OS铏氭嫙鐜鏉ヨ窇TB.EXE, 閭f槸蹇呴』鐨?..
浜庢槸灝辨湁浜?jiǎn)涓嬮潰鐨勬埅鍥?