以自動(dòng)實(shí)現(xiàn)KeyEvent.Callback接口為例子啟動(dòng)AndroidStudio,打開demo工程增加實(shí)現(xiàn)KeyEvent.Callback的類使用Alt+Enter快捷鍵把光標(biāo)定位到接口名按Alt+Enter,并點(diǎn)擊;Implementmethods;菜單項(xiàng)在彈出的“SelectMethodstoImplement”對話框中,點(diǎn)擊OK按鈕這樣就可以實(shí)現(xiàn)所有的接口函數(shù)了。使用菜單實(shí)現(xiàn)接口方法把光標(biāo)定位到接口名,執(zhí)行菜單“Code”-“ImplementMethods”在彈出的“SelectMethodstoImplement”對話框中,點(diǎn)擊OK按鈕這樣就可以實(shí)現(xiàn)所有的接口函數(shù)了
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、成都做網(wǎng)站、涵江網(wǎng)絡(luò)推廣、微信小程序、涵江網(wǎng)絡(luò)營銷、涵江企業(yè)策劃、涵江品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供涵江建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
SurfaceView是View的繼承結(jié)構(gòu)中一個(gè)比較特殊的子類,它的作用是提供一個(gè)第二線程來完成圖形的繪制。因此應(yīng)用程序不需要等待View的圖形繪制,第二線程會(huì)異步完成圖形的繪制。
SurfaceView實(shí)現(xiàn)的步驟:
繼續(xù)SurfaceView并實(shí)現(xiàn)SurfaceHolder.Callback接口,該接口提供了SurfaceView創(chuàng)建、屬性發(fā)生變化、銷毀的時(shí)間點(diǎn),那么你可以在適當(dāng)?shù)臅r(shí)間點(diǎn)完成具體的工作。
在SurfaceView初始化的時(shí)候調(diào)用SurfaceView.getHolder()方法獲取一個(gè)SurfaceHolder,SurfaceHolder用于管理SurfaceView的工作過程。為了讓SurfaceHolder起作用,必須為SurfaceHolder添加回調(diào)方法(即第一步實(shí)現(xiàn)的SurfaceHolder.Callback):
[java] view plaincopyprint?
SurfaceHolder.addCallBack(SurfaceHolder.Callback);
在SurfaceView內(nèi)創(chuàng)建第二線程的內(nèi)部類(暫命名為SecondThread),它的主要任務(wù)是完成Canvas的圖形繪制。為了能讓SecondThread獲得Canvas實(shí)例,必須給SecondThread傳遞在步驟二中獲得的SurfaceHolder。現(xiàn)在就可以通過SurfaceHolder.lockCanvas()方法得到Canvas實(shí)例,并在Canvas上繪制圖形。當(dāng)圖形繪制完成后,必須馬上調(diào)用SurfaceHolder.unlockCanvasAndPost()為Canvas解鎖,使其他線程可以使用該畫布。
有幾個(gè)注意點(diǎn):
每一次通過SurfaceHolder獲取的Canvas都會(huì)保持上一次繪制的狀態(tài)。如果需要重新繪制圖形,可以通過調(diào)用Canvas.drawColor()或Canvas.drawBitmap()來擦除上次遺留的圖形。
并不一定只用第二線程來繪制圖形,也可以開啟第三,第四個(gè)線程來繪制圖形。
注意線程安全。
不需要像View一樣,調(diào)用invalidate()方法來指示圖形的刷新。
SurfaceView的一個(gè)范例:
[java] view plaincopyprint?
package com.sin90lzc.android.sample;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CanvasView extends SurfaceView implements SurfaceHolder.Callback {
public static class Point {
private float x;
private float y;
public Point(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
public Point nextPoint(Orien o) {
float tempX = x;
float tempY = y;
switch (o) {
case UP:
tempY = y - LINE_LENGTH;
break;
case DOWN:
tempY = y + LINE_LENGTH;
break;
case LEFT:
tempX = x - LINE_LENGTH;
break;
case RIGHT:
tempX = x + LINE_LENGTH;
break;
case UNKNOWN:
break;
}
return new Point(tempX, tempY);
}
}
enum Orien {
UP, LEFT, DOWN, RIGHT, UNKNOWN
}
public static class DrawThread extends Thread {
private ListPoint points = Collections
.synchronizedList(new ArrayListPoint());
private boolean mRun;
private Paint mPaint;
private Orien curOrien;
public synchronized void setRun(boolean run) {
this.mRun = run;
notifyAll();
}
public synchronized boolean getRun() {
while (!mRun) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return mRun;
}
//當(dāng)按上下左右鍵時(shí),生成相應(yīng)的點(diǎn)坐標(biāo)
private synchronized boolean doKeyDown(int KeyCode, KeyEvent event) {
synchronized (holder) {
Point p = null;
switch (KeyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
if (curOrien != Orien.DOWN) {
curOrien = Orien.UP;
p = curPoint.nextPoint(curOrien);
}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
if (curOrien != Orien.UP) {
curOrien = Orien.DOWN;
p = curPoint.nextPoint(curOrien);
}
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
if (curOrien != Orien.RIGHT) {
curOrien = Orien.LEFT;
p = curPoint.nextPoint(curOrien);
}
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (curOrien != Orien.LEFT) {
curOrien = Orien.RIGHT;
p = curPoint.nextPoint(curOrien);
}
break;
default:
curOrien = Orien.UNKNOWN;
}
if (p != null) {
curPoint = p;
points.add(p);
setRun(true);
}
Log.i(LOG_TAG, curOrien.toString());
}
return true;
}
//當(dāng)釋放按鍵時(shí),停止繪圖
private synchronized boolean doKeyUp(int KeyCode, KeyEvent event) {
synchronized (holder) {
setRun(false);
curOrien = Orien.UNKNOWN;
}
return true;
}
SurfaceHolder holder;
private Point curPoint;
public DrawThread(SurfaceHolder holder) {
this.holder = holder;
mPaint = new Paint();
mPaint.setColor(Color.GREEN);
curPoint = new Point(50, 50);
points.add(curPoint);
}
public void resetPoint() {
}
private void doDraw(Canvas canvas) {
for (int i = 0; i + 1 points.size(); i += 1) {
Point lp = points.get(i);
Point np = points.get(i + 1);
canvas.drawLine(lp.getX(), lp.getY(), np.getX(), np.getY(),
mPaint);
}
}
@Override
public void run() {
Canvas canvas = null;
while (getRun()) {
try {
canvas = holder.lockCanvas();
synchronized (holder) {
doDraw(canvas);
}
} finally {
holder.unlockCanvasAndPost(canvas);
setRun(false);
}
}
}
}
private DrawThread thread;
public static final String LOG_TAG = "CanvasView";
private static final int LINE_LENGTH = 30;
public CanvasView(Context context) {
super(context);
}
public CanvasView(Context context, AttributeSet attrs) {
super(context, attrs);
//SurfaceView由SurfaceHolder管理
SurfaceHolder holder = getHolder();
holder.addCallback(this);
thread = new DrawThread(holder);
thread.start();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return thread.doKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
return thread.doKeyUp(keyCode, event);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.i(LOG_TAG, "surfaceChanged");
thread.resetPoint();
thread.setRun(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i(LOG_TAG, "surfaceCreated");
thread.resetPoint();
thread.setRun(true);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(LOG_TAG, "surfaceDestroyed");
thread.setRun(false);
}
}
Notice:例子中,沒一次按下方向鍵都得把所有坐標(biāo)重新繪制一遍。如果只是繪制最后一次沒繪制的點(diǎn)時(shí),不知道為什么會(huì)變成虛線,有待解決。
《王者榮耀》快速獲得40個(gè)皮膚碎片如下:
1、連續(xù)簽到七天,可以獲得一個(gè)皮膚碎片。
2、在商城的新品界面,消耗20榮耀積分參與抽獎(jiǎng),可以抽到一個(gè)或兩個(gè)皮膚碎片。
3、在商城的特惠界面,點(diǎn)擊限購,可以消費(fèi)20點(diǎn)券購買皮膚碎片福袋,可以獲得兩個(gè)皮膚碎片。
4、在商城的奪寶界面,點(diǎn)擊積分奪寶,消耗60榮耀積分可以參與抽獎(jiǎng),可能會(huì)抽到五個(gè)皮膚碎片。
5、在榮耀戰(zhàn)令界面點(diǎn)開兌換界面,消耗10戰(zhàn)令幣可以兌換一個(gè)史詩皮膚秘寶,可能會(huì)開出兩個(gè)皮膚碎片?;蛘呦?0戰(zhàn)令幣直接兌換一個(gè)皮膚碎片。
6、在友情重燃界面點(diǎn)擊友情商店,消耗4個(gè)友情積分可以兌換一個(gè)皮膚碎片。
王者榮耀簡介:
《王者榮耀》是由騰訊游戲天美工作室群開發(fā)并運(yùn)行的一款運(yùn)營在Android、IOS、NS平臺(tái)上的MOBA類國產(chǎn)手游,于2015年11月26日在Android、IOS平臺(tái)上正式公測,游戲前期使用名稱有《英雄戰(zhàn)跡》、《王者聯(lián)盟》。
服務(wù)器寫一個(gè)同步方法一次只返回一條數(shù)據(jù)
當(dāng)有人去獲取數(shù)據(jù)時(shí),發(fā)現(xiàn)為0了就表示完了
這是一個(gè)同步的問題,即多(用戶)線程訪問服務(wù)端的時(shí)候,你要確保某個(gè)方法是同步的,即一次只能有一條線程訪問
抽獎(jiǎng)的轉(zhuǎn)盤,你可以設(shè)置轉(zhuǎn)盤的每部分都是一個(gè)數(shù)字,使用隨機(jī)函數(shù)來定義,不過需要設(shè)置一個(gè)條件,讓其到達(dá)抽中大獎(jiǎng),重新設(shè)置值等等。