android自定义控件画布canvas背景色失效变黑色
2017-04-13 10:10
288 查看
错误示范:
*****************************************************************************************************************************************************************************************
页面显示:
gps_view_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/satellites_bg"
>
<TextView android:id="@+id/gps_status_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="状态"/>
<TextView android:id="@+id/lonlat_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0 0"/>
//自定义控件显示卫星分布状态图
<ylybbs.study.mygpstest.SatellitesView
android:id="@+id/satellitesView"
android:layout_width="match_parent"
android:layout_height="fill_parent" />
</LinearLayout>
*****************************************************************************************************************************************************************************************
自定义控件画图:
public void run() {
List<GpsSatellite> list=null;
Canvas c = null;
try {
c = surfaceHolder.lockCanvas(null);
//设置画布背景色为白色,即自定义控件显示的背景色为白色:
c.drawRGB(255,255,255);
//初始化画板的中心坐标
cx = c.getWidth() / 2;
cy = c.getWidth() / 2;
synchronized (surfaceHolder) {
doDraw(c,null);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
while (isRunning) {
try{
list = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
doDraw(c,list);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
private void doDraw(Canvas canvas, List<GpsSatellite> satellites) {
if (canvas != null) {
// 绘制背景罗盘
drawBackground(canvas, cx, cy, compassRadius);
//绘制卫星分布
if (satellites != null) {
for (GpsSatellite satellite : satellites) {
drawSatellite(canvas,satellite, cx, cy, compassRadius);
}
}
}
}
结果设置的画布的颜色失效,自定义控件背景显示为黑色:
![](http://img.blog.csdn.net/20170413105017913?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2Vhc2hpbmVfeWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
正确修改绘图java文件:
*****************************************************************************************************************************************************************************************
public void run() {
List<GpsSatellite> list=null;
Canvas c = null;
try {
c = surfaceHolder.lockCanvas(null);
//设置画布背景色为白色,即自定义控件显示的背景色为白色:
// c.drawRGB(255,255,255);
//此处设置画布颜色不行,得到doDraw()设置
//初始化画板的中心坐标
cx = c.getWidth() / 2;
cy = c.getWidth() / 2;
synchronized (surfaceHolder) {
doDraw(c,null);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
while (isRunning) {
try{
list = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
doDraw(c,list);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
private void doDraw(Canvas canvas, List<GpsSatellite> satellites) {
if (canvas != null) {
canvas.drawRGB(255,255,255); // 绘制背景罗盘
drawBackground(canvas, cx, cy, compassRadius);
//绘制卫星分布
if (satellites != null) {
for (GpsSatellite satellite : satellites) {
drawSatellite(canvas,satellite, cx, cy, compassRadius);
}
}
}
}
经过上述修改,画布显示为其设置的颜色。
![](http://img.blog.csdn.net/20170413105041726?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2Vhc2hpbmVfeWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
综上所述,画布背景色的设置,应该在doDraw()函数中设置,而不能直接在run()初始化时设置。
*****************************************************************************************************************************************************************************************
页面显示:
gps_view_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/satellites_bg"
>
<TextView android:id="@+id/gps_status_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="状态"/>
<TextView android:id="@+id/lonlat_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0 0"/>
//自定义控件显示卫星分布状态图
<ylybbs.study.mygpstest.SatellitesView
android:id="@+id/satellitesView"
android:layout_width="match_parent"
android:layout_height="fill_parent" />
</LinearLayout>
*****************************************************************************************************************************************************************************************
自定义控件画图:
public void run() {
List<GpsSatellite> list=null;
Canvas c = null;
try {
c = surfaceHolder.lockCanvas(null);
//设置画布背景色为白色,即自定义控件显示的背景色为白色:
c.drawRGB(255,255,255);
//初始化画板的中心坐标
cx = c.getWidth() / 2;
cy = c.getWidth() / 2;
synchronized (surfaceHolder) {
doDraw(c,null);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
while (isRunning) {
try{
list = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
doDraw(c,list);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
private void doDraw(Canvas canvas, List<GpsSatellite> satellites) {
if (canvas != null) {
// 绘制背景罗盘
drawBackground(canvas, cx, cy, compassRadius);
//绘制卫星分布
if (satellites != null) {
for (GpsSatellite satellite : satellites) {
drawSatellite(canvas,satellite, cx, cy, compassRadius);
}
}
}
}
结果设置的画布的颜色失效,自定义控件背景显示为黑色:
正确修改绘图java文件:
*****************************************************************************************************************************************************************************************
public void run() {
List<GpsSatellite> list=null;
Canvas c = null;
try {
c = surfaceHolder.lockCanvas(null);
//设置画布背景色为白色,即自定义控件显示的背景色为白色:
// c.drawRGB(255,255,255);
//此处设置画布颜色不行,得到doDraw()设置
//初始化画板的中心坐标
cx = c.getWidth() / 2;
cy = c.getWidth() / 2;
synchronized (surfaceHolder) {
doDraw(c,null);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
while (isRunning) {
try{
list = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
doDraw(c,list);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
private void doDraw(Canvas canvas, List<GpsSatellite> satellites) {
if (canvas != null) {
canvas.drawRGB(255,255,255); // 绘制背景罗盘
drawBackground(canvas, cx, cy, compassRadius);
//绘制卫星分布
if (satellites != null) {
for (GpsSatellite satellite : satellites) {
drawSatellite(canvas,satellite, cx, cy, compassRadius);
}
}
}
}
经过上述修改,画布显示为其设置的颜色。
综上所述,画布背景色的设置,应该在doDraw()函数中设置,而不能直接在run()初始化时设置。
相关文章推荐
- Android画布和图形绘制---Canvas and Drawables(三)
- Android 自定义控件canvas- Layer图层
- Android自定义万能Canvas画布
- Android画布和图形绘制---Canvas and Drawables(一)
- Android Canvas画布相对位置
- android自定义控件(二)Canvas
- Android 游戏开发之Canvas画布
- Android开发,如何使canvas画布背景色透明。
- Android自定义控件前导基础知识学习(一)——Canvas
- 自定义控件设置canvas画布的大小
- Android画布和图形绘制---Canvas and Drawables(五)
- Android 游戏开发之Canvas画布
- Android画布和图形绘制---Canvas and Drawables(一)
- Android 绘图基础:Canvas画布——自定义View基础(绘制表盘、矩形、圆形、弧、渐变)
- Android画布和图形绘制---Canvas and Drawables
- Android画布和图形绘制---Canvas and Drawables(一)
- Android自定义控件 -Canvas绘制折线图(实现动态报表效果)
- Android 的画布Canvas和画笔Paint
- android:PopupWindow设置背景色为0x00000000为什么不是黑色
- 自定义控件---图层,画布和canvas