Android studio游戏开发就是这么简单:卡牌杀系列(核心UI篇:SufaceView的核心用法)
Android studio五年经验教你如何:花费了2周快速开发卡牌杀系类游戏,核心思路分享之图片绘制
卡牌杀效果-Android studio游戏开发,如何打造类似三国杀英雄杀类游戏
相关源码 学习加群:
本篇主题:
SufaceView提供一个Canvas, Canvas不能拥有View,所以没有直接DrawView的用法,也不能Canvas.draw(layout),但可以 layout.draw(Canvas) 【听不懂可以直接跳过,进入下面主题】
Sufaceview主要负责绘制Rect 以及Bitmap
Sufaceview的核心任务就是绘制bitmap 以及绘制矩形 【涉及 坐标就有坐标点--- left top (左上角的(x,y))以及 bitmap 的 宽 高】
游戏设计不想后期混乱,导致霸鸽四起,始终坚持 设计模式的单一职责
一个类负责一个任务,一个类管理该任务的所有方法
例如指的的是:任务开始,任务暂停,任务结束
如果你有一个View ,需要在Sufaceview中绘制,则你需要先转换成Bitmap,例如这段代码【第一段 听不懂 看了下面代码.. 】
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
v.draw(c);
return b;
}
而基于对Bitmap的解析,谷歌官方推荐使用Glide,安排,导入配置
repositories {
google()
mavenCentral()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
}
创建一个Bitmap管理生产类
public class BitmapUtils {
public static Bitmap ScaledBitmap(Bitmap bitmap,int width,int height){
return Bitmap.createScaledBitmap(bitmap, width, height, false);
}
public static Bitmap loadBitmap(Activity activity,int mip, int w, int h) throws ExecutionException, InterruptedException {
Bitmap load = Glide.with(activity).asBitmap()
.load(mip)
.submit(300,300).get();
return BitmapUtils.ScaledBitmap(load,w,h);}
}
调用的时候
BitmapUtils .loadBitmap(Activity activity,int mip, int w, int h)
activity 你的Activity
mip--项目中图片的id,例如:R.drawable.abc 或者R.mipmap.abc
w--指定目标宽度
h--指定目标高度
好了进入主题,sufaceview的绘制Bitmap:
private Bitmap load ;//必须是全局变量,不能是局部变量,Surfaceview运行后是一个死循环,局部变量会占据无限内存导致卡死
public void drawbg(Canvas canvas,int mipmap,int w,int h,int left,int top) {
// Log.v("----11","p1 draw ok");
try {
if (load==null) {
load =loadBitmap(mipmap,w,h);//确保非空且只允许只有一个bitmap避免性能出错
}else {
canvas.drawBitmap(load,left,top,null);//核心语句,绘制赋予左上角坐标(left,top)的Bitmap
}
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}