版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010356768/article/details/89422245
创建CustomSurfaceView
public class CustomSurfaceView extends SurfaceView {
int viewWidth,viewHeight;
//管理surfaceview
SurfaceHolder surfaceHolder;
public CustomSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
surfaceHolder = getHolder();
MyCallback myCallback = new MyCallback();
surfaceHolder.addCallback(myCallback);
}
class MyCallback implements SurfaceHolder.Callback{
//surfaceview创建完成
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
}
//surfaceview大小发生变化
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
//
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
}
}
activity_main布局中使用控件
<com.xx.customsurfaceview.CustomSurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent" />
先了解下执行流程:
surfaceCreated——>surfaceChanged
如果单击返回键执行:
surfaceDestroyed
public class CustomSurfaceView extends SurfaceView {
int viewWidth,viewHeight;
//管理surfaceview
SurfaceHolder surfaceHolder;
Thread thread;
public CustomSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
surfaceHolder = getHolder();
MyCallback myCallback = new MyCallback();
surfaceHolder.addCallback(myCallback);
}
class MyRunnable implements Runnable {
@Override
public void run() {
Canvas canvas = null;
//view是把内容直接画到屏幕上
//surfaceview先把内容画到内存
try {
canvas = surfaceHolder.lockCanvas();
Paint paint = new Paint();
paint.setColor(Color.RED);
//画背景
Rect rect = new Rect(0,0,viewWidth,viewHeight);
canvas.drawRect(rect,paint);
//画文字
paint.setColor(Color.GREEN);
paint.setTextSize(48);
canvas.drawText("1064",50,200,paint);
} catch (Exception e) {
e.printStackTrace();
} finally {
//把内存画好的东西画到屏幕上
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
class MyCallback implements SurfaceHolder.Callback{
//surfaceview创建完成
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
thread = new Thread(new MyRunnable());
thread.start();
}
//surfaceview大小发生变化
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
viewWidth = i1;
viewHeight = i2;
}
//
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
}
}
现在绘制以下效果
public class CustomSurfaceView extends SurfaceView {
......
Bitmap heart1,heart2;
int imageX;
int direction;
final static int left = 1;
final static int right = 2;
boolean isRunning = true;
public CustomSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
......
heart1 = BitmapFactory.decodeResource(getResources(),R.mipmap.heart1);
heart2 = BitmapFactory.decodeResource(getResources(),R.mipmap.heart2);
}
class MyRunnable implements Runnable {
@Override
public void run() {
while(isRunning){
Canvas canvas = null;
//view是把内容直接画到屏幕上
//surfaceview先把内容画到内存
try {
......
//画图
//direction是移动方向
if(direction == right){
imageX = imageX + 20;
canvas.drawBitmap(heart1,imageX,100,paint);
}else{
imageX = imageX - 20;
canvas.drawBitmap(heart2,imageX,100,paint);
}
//<0说明在最左边
if(imageX < 0){
direction = right;
}
//如果大于屏幕宽度,说明移到了最右边
if(imageX > viewWidth){
direction = left;
}
Thread.currentThread().sleep(100);
} catch (Exception e) {
e.printStackTrace();
} finally {
//把内存画好的东西画到屏幕上
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
class MyCallback implements SurfaceHolder.Callback{
//surfaceview创建完成
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
thread = new Thread(new MyRunnable());
thread.start();
}
//surfaceview大小发生变化
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
viewWidth = i1;
viewHeight = i2;
//开始图片在最右边
imageX = i1 ;
}
//
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
isRunning = false;
}
}
}
其中heart1、heart2是两张png图片
现在实现文字移动效果
public class CustomSurfaceView extends SurfaceView {
......
String[] stringArray = {"Errol_King","代码狂欢到深夜"};
int stringY;
......
class MyRunnable implements Runnable {
@Override
public void run() {
while(isRunning){
Canvas canvas = null;
//view是把内容直接画到屏幕上
//surfaceview先把内容画到内存
try {
canvas = surfaceHolder.lockCanvas();
Paint paint = new Paint();
paint.setColor(Color.RED);
//画背景
Rect rect = new Rect(0,0,viewWidth,viewHeight);
canvas.drawRect(rect,paint);
//画文字
......
//画图
......
//画文字
paint.setColor(Color.WHITE);
paint.setTextSize(70);
stringY = stringY - 20;
for(int i=0;i<stringArray.length;i++){
//假定每行高50
int y = stringY + i*70;
canvas.drawText(stringArray[i],50,y,paint);
}
Thread.currentThread().sleep(100);
} catch (Exception e) {
e.printStackTrace();
} finally {
//把内存画好的东西画到屏幕上
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
......
}