編輯:關於Android編程
com.thinkive.ziyouxing.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.thinkive.adf.log.Logger;
/**
* 文件名: com.thinkive.ziyouxing.views.GameView
* 作者: 熊傑
* 日期: 14-4-14
* 時間: 13:40
* 開發工具: IntelliJ IDEA 12.0.4
* 開發語言: Java,Android
* 開發框架:
* 版本: v0.1
* 說明
*
*/
public class GameView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
private SurfaceHolder surfaceHolder;
private Canvas canvas;
private Paint paint;
//默認情況下是一直在運行的
private boolean isRunning = true;
//半徑增加
private int x = 0;
public GameView(Context context) {
super(context);
surfaceHolder = this.getHolder();
surfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
}
/**
* 當SurfaceView消毀時執行,當應用程序退出時,當前SurfaceView就消毀掉了,子線程在運行過程中還在往界面上進行繪制,
* View都沒有了,怎麼能往上面進行繪制呢?所以在運行過程中會出異常。
*
* 當View消毀的時候就記線程不要再進行繪制了。
*
* @param surfaceHolder
*/
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
isRunning = false;
}
@Override
public void run() {
while (isRunning) {
try {
drawView();
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 用線程畫圖
*
* 在做游戲開發的時候,我們要定期的對屏幕進行刷新.即在線程裡面每隔100毫秒,屏幕會繪制一遍。線程什麼時候啟動呢?
*
* SurfaceView創建成功之後,有界面了,創建一個啟動線程線程一啟動,每過100毫秒就繪制一遍界面。
*
* 只畫邊界,而不填充裡面的顏色,該如何做呢?
*
* paint.setStyle(Paint.Style.STROKE);
* 界面被消毀的時候,首先是Canvas被消毀,然後SurfaceHolder才會被消毀
*/
private void drawView() {
try {
if (null != surfaceHolder) {
canvas = surfaceHolder.lockCanvas();
paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
canvas.drawCircle(200, 200, x++, paint);
}
} catch (Exception e) {
Logger.info(this.getClass(), "畫圖異常", e);
} finally {
if (null != canvas) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
/**
* 讓子線程提前結束,當按鍵的時候,首先按件事件被響應,這個響應完了之後,界面才退出。也就是從事件開始執行,到界面消毀中間還有那麼一段時間,如果在此方法中就讓線程終止運行
* 當界面真正消毀的時候,子線程已經結束了。
* @param keyCode
* @param event
* @return
*/
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// if(keyCode == KeyEvent.KEYCODE_BACK){
// isRunning = false;
// }
// return true;
// }
}
package com.thinkive.ziyouxing.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* 文件名: com.thinkive.ziyouxing.views.GameView
* 作者: 熊傑
* 日期: 14-4-14
* 時間: 13:40
* 開發工具: IntelliJ IDEA 12.0.4
* 開發語言: Java,Android
* 開發框架:
* 版本: v0.1
* 說明
*
*/
public class GameView1 extends SurfaceView{
//可以理解為指向SurfaceView的一個指針,可以類比成控制電視機的搖控器,而SurfaceView則是電視機,以後如果要控制電視機,
//則只需操作搖控器就可以了。
private SurfaceHolder surfaceHolder;
//面板對象
private Canvas canvas;
//畫筆
private Paint paint;
/**
* 當我對象創建成功之後,構造器就會獲得執行,但是構造器執行的時候,界面並沒有顯示出來。對象是有了,但是界面並沒有真正的畫上去,我們應該等當前屏幕畫上去了,
* 我再通過屏幕鎖定,我獲得一個面板,面板再畫才可以,因為現在對象剛剛創建成功,界面還沒有出來,獲取到的面板是空的,所以也就不能進行繪制了,那麼現在我怎麼確定執行畫圖的時候,
* 這個View界面已經創建成功了呢?
* SurfaceView裡面有一個輔助類,sh.addCallBack()這個回調類似於注冊監聽,比如說按鈕的單擊監聽,還有觸摸監聽,按鍵監聽等等。
* 也就是說在SurfaceHolder上面注冊一個監聽,當SurfaceHolder狀態改變的時候,監聽裡面的方法會自動執行。
* 說SurfaceHolder狀態改變,實際上也就是SurfaceView的一個狀態的改變,
* 我們再寫事件監聽的時候,基本上所有的事件監聽,所涉及到的那些方法,都是回調方法。
*
* 什麼是回調方法呢?
*
* 也就是這些方法不是我去調用的,而是系統去調用的。
* @param context
*/
public GameView1(Context context) {
super(context);
surfaceHolder = this.getHolder();
surfaceHolder.addCallback(new GameViewCallBack());
}
class GameViewCallBack implements SurfaceHolder.Callback{
//當SurfaceView創建成功了執行
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
//鎖定面板之後,會得到一個Canvas,將面板鎖定之後,我就可以進行繪畫了,比如畫圓,畫直線...
Canvas canvas = surfaceHolder.lockCanvas();
paint = new Paint();
paint.setColor(Color.RED);
canvas.drawLine(0,0,100,100,paint);
//繪制結束之後,解除面板鎖定,並且發送,把當前已經畫好的面板,發送到屏幕界面上。把面板發送,發送到哪兒呢?發送到界面上進行顯示。我們說它自帶二級緩存,這個地方就體現了二級緩存,
//是我先鎖定,不操作先鎖定,整個畫完之後,顯示就可以了。
surfaceHolder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height ) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
}
}
Android 繼承DialogFragment彈出dialog對話框二
之前寫過一篇關於Android 繼承DialogFragment彈出dialog對話框一,這次是在上次的基礎上修改了一些東西,就是怎樣在DialogFragment中獲取
【Android】Android Design Support Library 的使用
Android 5.0 Lollipop 推出了 Material Design 安卓界面風格的設計理念並且給出了一個 Material Design 的兼容庫,庫中包含
Android Notification的簡單應用
Notification是顯示在手機狀態欄的通知,手機狀態欄位於手機屏幕的最上方,哪裡一般顯示了手機當前的網絡狀態、電池狀態、時間等。Notification鎖代表的是一
android之ViewPager介紹
一:ViewPager的含義:ViewPager的功能就是可以使視圖滑動,就像Lanucher左右滑動那樣。ViewPager用於實現多頁面的切換效果,該類存在於Goog