Open rainit2006 opened 7 years ago
CrazyCat
SurfaceView
show parts of a image
SurfaceHolder.lockCanvas() returns null The returned Canvas can be used to draw into the surface's bitmap. A null is returned if the surface has not been created or otherwise cannot be edited. You will usually need to implement Callback.surfaceCreated to find out when the Surface is available for use.
Deep copy Object类里的clone方法是浅复制(浅克隆)
Object#clone() Javaの全てのクラスの親であるObjectクラスには、clone()という、複製を作成するメソッドが用意されている。 ただしこのメソッドはprotectedなので、サブクラスでオーバーライドしてpublicにしてやらないと、外部から呼び出すことが出来ない。
public class Sample implements Cloneable {
@Override
public Object clone() { //throwsを無くす
try {
return **super.clone**();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.toString());
}
}
}
textはStringBuffer型という参照型。cloneだと、textはDeepCopyできない。
http://www.creative-forest.com/java/java_tips/oop/shallow_deep/shallow_deep.html
シリアライズによる複製
/**
* 符号化により複製を生成可能なUserクラス。
*
*/
class User implements Serializable { // ← Serializableをimplementsする
/** ID */
private int id;
/** 名前 */
private String name; // StringはSerializableをimplementsしている
/** お誕生日 */
private Date birthDate; // DateはSerializableをimplementsしている
// ~~ 省略 ~~
}
User maekawa = new User(1, "前川", birthDate);
User cloneMaekawa = (User) SerializeUtils.deepCopy(maekawa);
もう一つ詳細のサイト: http://www.avajava.com/tutorials/lessons/how-do-i-perform-a-deep-clone-using-serializable.html
//自定义绘图方法
public void myDraw(){
//game over
if(player.live<=0){
flag=false;
context.hanlder.post(new Runnable(){
public void run() {
context.showDialog();
}
});
return;
}
Dialog類はactivityを生成したメインスレッド(?)でしか生成できません。 なので、Viewで作って表示する場合はActivityを経由して、Activityが作ったように見せかける必要があります。そこで使われるのが Handleです。
public class MyActivity extends Activity
{
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
public void PostRunnable(final Runnable run)
{
mHandler.post(run);
}
}
public class MyView extends SurfaceView
{
private MyActivity mActivity = null;
public MyView( Context context )
{
super( context );
mActivity = (MyActivity)context;
}
void showDialog()
{
mActivity.PostRunnable(new Runnable(){
@Override public void run(){
//ダイアログの作成&表示
}
);
}
}