android 别踩白板设计,Android的别踩白块开发,使用SurfaceView(一)。

编写这个程序之前,你需要对SurfaceView有一定的了解。

View是使用UI主线程开发的,如果UI主线程任务过于繁重,那么UI主线程将阻塞。

SurfaceView是直接从内存和DMA等取得数据,而且SurfaceView可以通过主线程之外的线程更新UI。

被动更新:通过点击事件等更新。(VIEW)

主动更新:一直在更新。(Surface)

这是游戏结束时弹出的对话框,为了避免重复刷新获取视图资源,所以采取静态内部类来供调用。

public class AlertScoreDialog extends Dialog{

private TextView tv_score;

private Button btn_finish;

private Button btn_restart;

private View mRootView;

public AlertScoreDialog(Context context) {

this(context,0);

}

public AlertScoreDialog(Context context, int themeResId) {

super(context, themeResId);

mRootView = LayoutInflater.from(getContext()).inflate(R.layout.dialog_score,null);

tv_score = (TextView) mRootView.findViewById(R.id.tv_score);

btn_finish = (Button) mRootView.findViewById(R.id.dialog_btn_finish);

btn_restart = (Button) mRootView.findViewById(R.id.dialog_btn_restart);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(mRootView);

Window window = getWindow();

window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

setCanceledOnTouchOutside(false);

}

public void setScore(String score){

if(tv_score!=null){

tv_score.setText(score);

}

}

private void setFinishClickListener(View.OnClickListener onClickListener){

if(btn_finish!=null){

btn_finish.setOnClickListener(onClickListener);

}

}

private void setRestartClickListener(View.OnClickListener onClickListener){

if(btn_restart!=null){

btn_restart.setOnClickListener(onClickListener);

}

}

//静态内部类,供主UI调用。

public static class Builder {

private AlertScoreDialog mAlertScoreDialog;

public Builder(Context context){

mAlertScoreDialog = new AlertScoreDialog(context);

}

public Builder setScore(String score){

mAlertScoreDialog.setScore(score);

return this;

}

public Builder setFinishClickListener(View.OnClickListener onClickListener){

mAlertScoreDialog.setFinishClickListener(onClickListener);

return this;

}

public Builder setRestartClickListener(View.OnClickListener onClickListener){

mAlertScoreDialog.setRestartClickListener(onClickListener);

return this;

}

public AlertScoreDialog builder(){

return mAlertScoreDialog;

}

}

}

本程序黑白快需要一直更新,所以用SurfaceView。

SurfaceHolder可以看成SurfaceView的控制器,控制图形图像的大小像素等。 继承SurfaceHolder接口所以需要实现三个回调方法。

这是开始创建时的回调方法,在此方法中使用 initBlock();进行初始化黑白块。然后开启线程。

public void surfaceCreated(SurfaceHolder holder) {

initBlock();

mBlockPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mScorePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mScorePaint.setTextSize(DensityUtil.sp2px(getContext(),mScore.getTextSize()));

mScorePaint.setColor(mScore.getTextColor());

//设置边框线 mScorePaint.setStrokeWidth(DensityUtil.px2dip(getContext(),mScore.getStrokeWidth()));

// 开启线程

mIsRuning = true;

mDrawThread = new Thread(this);

mDrawThread.start();

}

mDrawThread 线程中有一个draw()方法,用于绘制block和score,draw()负责把黑白快下移。

UI线程分析在博客二。

源码地址:https://github.com/ZeeeeeeNo/PianoTiles

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值