说一个真实的案例。其中需求要做一个绘图功能,一听到绘图,自然而然就像到了SurfaceView这个类。所以我就用了。

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/edit"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

然后就是MySurfaceView继承SurfaceView,然后我们就会定义一个drawCanvas方法去绘图,通常的做法就是这样

package com.example.test;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

public class MySurfaceVivew extends SurfaceView{

private SurfaceHolder holder;

private Bitmap bitmap;

public MySurfaceVivew(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

holder = this.getHolder();

}

private void drawCanvas(Bitmap bitmap){

Canvas canvas = holder.lockCanvas();

if(canvas != null){

canvas.drawBitmap(bitmap, 0, 0, null);

holder.unlockCanvasAndPost(canvas);

}

}

public void setBitmap(Bitmap bitmap){

this.bitmap = bitmap;

this.drawCanvas(bitmap);

}

}

通过setBitmap去加载一张图片,然后在用画布画出来。但是很不幸,现实是残酷的,当Activity加载布局时图片闪一下就黑屏了。为什么呢?查了一下资料,原来Activity在加载时后会卸载SurfaceView,在创建后很快就被卸载掉了,所以只能见到闪的一下就黑屏了。有些资料会说在onResume方法中设,我也试了一下,发现不行,这下连闪都不闪一下。调试发现,canvas画布为空。自然,黑屏也就理所当然了。那怎么办,解决问题的办法才是问题的关键。那么,我们就要在画布创建时把图片画出来。

有了突破点就好办了。canvas画布在什么时候创建,就的看他谁提供的。canvas = holder.lockCanvas(),不难看出宿主是surfaceholder。那么是不是surfaceholder被创建的同时创建了canvas呢?我做了一次尝试。

package com.example.test;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

public class MySurfaceVivew extends SurfaceView implements SurfaceHolder.Callback{

private SurfaceHolder holder;

private Bitmap bitmap;

public MySurfaceVivew(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

holder = this.getHolder();

}

private void drawCanvas(Bitmap bitmap){

Canvas canvas = holder.lockCanvas();

if(canvas != null){

canvas.drawBitmap(bitmap, 0, 0, null);

holder.unlockCanvasAndPost(canvas);

}

}

public void setBitmap(Bitmap bitmap){

this.bitmap = bitmap;

this.drawCanvas(bitmap);

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

// TODO Auto-generated method stub

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

this.drawCanvas(bitmap);

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

}

}

canvas画布会黑屏吗_Android SurfaceView 黑屏问题相关推荐

  1. android锁屏流程_Android开机锁屏流程分析

    Android开机锁屏流程: 首先:手机开机时,在SystemServer类的init2()方法中会启动线程类ServerThread的run方法如下: WindowMan Android开机锁屏流程 ...

  2. 左右滑屏设置_android手势滑屏及左右滑屏

    ViewFlipper的使用(手势滑屏) 屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置页面. 通 ...

  3. android分屏模式_Android的分屏模式开发注意事项

    android7.0 的API开始有了分屏功能,在测试时注意到主页面在分屏模式下,页面所占比例在增大或者减小的时候都会调用oncreat方法,所以查资料总结一下分屏对页面的生命周期的影响以及开发时的注 ...

  4. webview 禁用横竖屏切换_Android 禁止横竖屏切换

    MainActivity里面的代码: public void onConfigurationChanged(Configuration newConfig) { try { super.onConfi ...

  5. 触屏版canvas画布实现touch坐标计算(坐标偏移问题)

    背景:最近踩了个坑,因为鼠标点击与触屏在坐标获取上有些不一样,再加上pageX/Y与clientX/Y的些许不一样,再加上html底部没有固定....导致画线的时候偏移了... = ̄ω ̄=使用鼠标事件 ...

  6. Android截屏SurfaceView黑屏问题解决办法

    Android截屏SurfaceView黑屏问题解决办法 参考文章: (1)Android截屏SurfaceView黑屏问题解决办法 (2)https://www.cnblogs.com/kongyf ...

  7. android华为虚拟截屏黑屏,Android截屏表面视图显示黑屏

    Android截屏表面视图显示黑屏 我试图通过代码拍摄我的游戏的截图,并通过一个意图来分享它.我能做这些事情,但是截图总是看起来是黑色的.下面是与分享截图相关的代码:View view = MainA ...

  8. s时钟画布 android,Canvas画布实现自定义时钟效果

    标题 *{margin:0; padding:0; list-style:none;} .box{ width: 420px; height: 420px; margin: 50px auto 0; ...

  9. 安卓SurfaceView截屏

    关于安卓SurfaceView截屏 2015.12.9号是一个值得记得日子,开始拖着背包从学校出来,挤上火车,做着接近30小时的硬座,来到了美丽的成都,那时候赵雷的<成都>还没火,'走到玉 ...

最新文章

  1. WCF分布式开发步步为赢(1):WCF分布式框架基础概念
  2. 最新知识图谱论文清单,就算看不懂也会忍不住收藏
  3. EF框架学习(5)---EF中的在线和离线场景
  4. 解决安卓TextView高度和textSize大小不一致问题
  5. 2012-12-17 → 2013-01-20 周总结:五周没写周总结了,今天来总结下
  6. jquery html app,jquery .html()vs .append()
  7. uml c语言函数流程图,UML流程图模板分享
  8. 《MyBatis3源码深度解析》图书简介
  9. 不同的智能门锁解决方案开锁方式
  10. 小电托——1-1磁路的基本概念和基本定律
  11. MSP430开发环境配置
  12. 年轻人想创业就去干吧,
  13. 使用MQTTlens和Mosquitto在WIN7上完成发布和订阅
  14. window系统中hosts文件位置与修改
  15. 正则表达式:回车和换行的区别
  16. 计算机 实验室安全准入制度,合肥工业大学实验室安全准入制度
  17. wireshark:跟踪流
  18. 赛门铁克推Android手机诺顿安全应用
  19. 华为日历怎么显示一月_南京百达翡丽服务去哪里表蒙摔碎了怎么办
  20. 华为 vlan 端口隔离

热门文章

  1. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
  2. Android学习总结00之废话
  3. .NET Framework 2.0新增特性总结
  4. Leetcode--76. 最小覆盖子串
  5. js纯ajax,自动完成JS类(纯JS, Ajax模式)
  6. python处理文件名_[请教]python的中文文件名处理
  7. 区块链 matlab,matlab可以实现区块链吗?
  8. text 两端对齐 小程序_小程序实现文字两端对齐
  9. C++初始化vector<vector<int>>
  10. Relu神经网络输出预测全为0或1,对所有输入样本的预测概率也相同