0 0

surfaceview中surfaceHolder.lockCanvas(null)返回为空? 10

我的一个activity里面有个surfaceView用于画数据图 此外我定义了一个Thread用于接受数据 在activity中我开启这个线程用activity里面的Handler来处理线程返回来的数据并调用画图方法 在surfaceView上画图  但是现在android surfaceHolder.lockCanvas(null)返回值为空  我不知道是为什么  急切求解中..

    dlThread=new DrawLineThread(this);
    dlThread.start();

    /**
	 * 绘制图线的方法
	 * @author ZH
	 * @param ylist
	 * 		  	是当前点在Y轴上的坐标值
	 */
    void deDraw(List ylist){
    	oldX=0f;
    	oldY=Float.parseFloat(ylist.get(0).toString());
    	oldY=height-(height/(Ymax-Ymin)*(oldY-Ymin)+1);
    	Canvas canvas = sfh.lockCanvas(new Rect(0, 0,width   
                ,height));// 关键:获取画布   
    	canvas.drawColor(Color.WHITE);
        Paint mPaint = new Paint();   
        mPaint.setColor(Color.GREEN);// 画笔为绿色   
        mPaint.setStrokeWidth(1);// 设置画笔粗细
        
//        //如果x超出了控件宽度,跳转到开始位置重新画
//        if(currentX>width){
//        Log.v("tag", "back to the head");
//        oldX=0;//把坐标转到最初位置
//        currentX=oldX+(width/10);
//        canvas.drawColor(Color.WHITE);
//        }
        //初始化oldY为控件高度
        if(oldY==-1){
        	oldY=height;
        	canvas.drawColor(Color.WHITE);
        }
        for(int i=1;i<ylist.size();i++){
        float y=Float.parseFloat(ylist.get(i).toString());
    	y=height-(height/(Ymax-Ymin)*(y-Ymin)+1);//根据控件大小缩放Y轴对应的比例
    	currentX=oldX+(width/Xrate);
        System.out.println("oldX-->"+oldX+"oldY-->"+oldY+"currentX--->"+currentX+"--currentY--->"+y);
        canvas.drawLine(oldX, oldY, currentX, y, mPaint);
        oldX=currentX;
        oldY=y;
        }
        sfh.unlockCanvasAndPost(canvas);
        
    }
	/**
	 * 清楚画布内容
	 */
    void ClearDraw() {   
        Canvas canvas = sfh.lockCanvas(null);  //就是在这个地方报NULLPOINTEXCEPTION,我log了一下是因为canvas==null        
canvas.drawColor(Color.WHITE);// 清除画布   
        sfh.unlockCanvasAndPost(canvas);   
    }
    public Handler graphhandler = new Handler()
    {
    	public void handleMessage(Message msg) 		
    	{
    		float point=(float)msg.arg1;
    		width=sfv.getWidth();
			height=sfv.getHeight();
			if(pointList.size()<=Xrate){
				pointList.add(point);
			}else{
				pointList.remove(0);
				pointList.add(point);
			}

			ClearDraw();
			deDraw(pointList);
    	}
    };

问题处在这一句
Canvas canvas = sfh.lockCanvas(null);  //就是在这个地方报NULLPOINTEXCEPTION,我log了一下是因为canvas==null

问题补充:
hudingchen 写道
Canvas canvas = sfh.lockCanvas(null);  //就是在这个地方报NULLPOINTEXCEPTION,我log了一下是因为canvas==null

如果这段代码NULLPOINTEXCEPTION,应该sfh是null,sfh在哪定义的,使用sfh=getHolder()了吗?

对 sfh通过getHolder()获得的,问题现在已经有了一些进展,原因是surfaceView里面调用draw()的时候,获取的控件的width和hight都是0,我 和同事进一步发现,只有在OnClickListener里面用:
引用
width=sfv.getWidth();
height=sfv.getHeight();

width和hight才不为0,
现在我们就是不知道为什么要在OnClickListener监听里面调用
引用
width=sfv.getWidth();
height=sfv.getHeight();

width和hight才不为0

问题补充:
hudingchen 写道
你把代码贴全了啊,Activity,DrawLineThread,现在看不出问题

上面的那个问题 现在可以描述成这样 下面是代码
public class newproActivity extends Activity {
    /** Called when the activity is first created. */
	TextView txt;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txt =(TextView)findViewById(R.id.txt);
		 int w=txt.getMeasuredHeight();
	        int h=txt.getMeasuredWidth();
	        System.out.println("BeforeClick: "+ w+ " : "+ h);
       
        Button btn=(Button)findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				txt =(TextView)findViewById(R.id.txt);
				 int w=txt.getMeasuredHeight();
			        int h=txt.getMeasuredWidth();
			        System.out.println("AfterClick: "+w+" : "+h);

			}
		});
    }
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
	android:id="@+id/txt"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    <Button android:id="@+id/btn"
     android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    />
</LinearLayout>


上面部分代码是activity  下面是XML    logcat里面的打印结果是
05-11 09:19:29.838: INFO/System.out(309): BeforeClick: 0 : 0
05-11 09:19:33.078: INFO/System.out(309): AfterClick: 19 : 320

问题就是为什么 第一行的结果会是0:0   第二行也就是点击button以后 才可以获取的TextView的width和hight      另外怎么才能在不用点击button的情况下获取到TextView的width和hight  也就是第一行的结果 不是 0:0

问题补充:
hudingchen 写道
你把代码贴全了啊,Activity,DrawLineThread,现在看不出问题

其实把
 int w=txt.getMeasuredHeight();   
 int h=txt.getMeasuredWidth(); 

换成
 int w=txt.getHeight();   
 int h=txt.getWidth(); 

结果是一样
2011年5月10日 10:15

3个答案 按时间排序 按投票排序

0 0

采纳的答案

这个应该android的框架问题,调用measure方法后,就可以了。

		txt = (TextView) findViewById(R.id.txt);
		txt.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
				MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));		
		int w = txt.getMeasuredHeight();
		int h = txt.getMeasuredWidth();

2011年5月11日 09:43
0 0

你把代码贴全了啊,Activity,DrawLineThread,现在看不出问题

2011年5月10日 16:46
0 0

Canvas canvas = sfh.lockCanvas(null);  //就是在这个地方报NULLPOINTEXCEPTION,我log了一下是因为canvas==null

如果这段代码NULLPOINTEXCEPTION,应该sfh是null,sfh在哪定义的,使用sfh=getHolder()了吗?

2011年5月10日 10:57

相关推荐

    SurfaceView + MediaPlayer 实现的视频播放器

    SurfaceView + MediaPlayer 实现的视频播放器,支持横竖屏切换,手势快进快退、调节音量,亮度等。------代码简单,基础应用

    自定义相机实现连拍

    surfaceView.getHolder() .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.getHolder().setFixedSize(176, 144); //设置Surface分辨率 surfaceView.getHolder().setKeepScreenOn(true);// ...

    SurfaceView

    并为SurfaceView的SurfaceHolder添加Callback监听器。 3、调用MediaPlayer对象的setDisplay(Surfaceolder sh)将所播放的视频图像输出到指定的SurfaceView组件 4、调用MediaPlayer对象的start()、stop()、和pause...

    安卓拍照上传录像监控录屏相关-自定义利用SurfaceView实现拍照.rar

    自定义利用SurfaceView实现拍照.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    21天学习android开发教程之SurfaceView

    写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个可以根据功能实际需要自己选择,我这里就直接在普通的用户界面调用SurfaceHolder的lockCanvas和unlockCanvasAndPost。 先来看看...

    Android代码-ScrollTextView

    Class ScrollTextView extends SurfaceView implements SurfaceHolder.Callback Android 滚动字幕,如新闻联播下面的,可以使用在广告机,机顶盒,电视App等信息发布系统。 以前是在信息发布系统上使用过,作为动态...

    surfaceview视频播放.rar

    基于android视频播放小案例

    安卓开发-VIEW双缓冲与SurfaceView比较.zip.zip

    安卓开发-VIEW双缓冲与SurfaceView比较.zip.zip

    Android 下载视频文件并自动播放.rar

    Android 下载视频文件并自动播放,下载影片并播放,重新建构MediaPlayer对象,设定显示于SurfaceHolder,在线程运行中,调用自定义函数抓下文件,自定义setDataSource,由线程启动,若无法顺利取得扩展名,预设为....

    Android提高之SurfaceView的基本用法实例分析

    写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个可以根据功能实际需要自己选择,本文所述方法就直接在普通的用户界面调用SurfaceHolder的lockCanvas和unlockCanvasAndPost。...

    NDK Camera

    SurfaceHolder holder = surfaceView.getHolder(); holder.setFixedSize(1920, 1080); holder.setFormat(ImageFormat.YUV_420_888); holder.addCallback(this); } @Override public void surfaceCreated...

    Android移动开发-使用MediaPlayer和SurfaceView播放视频的实现

    Step2:在界面布局文件中定义SurfaceView控件,或在程序中创建SurfaceView控件,并为SurfaceView的SurfaceHolder添加Callback监听器; Step3:调用MediaPlayer对象的setDisney(SurfaceHolder sh)方法将所播放的视频...

    安卓Android源码——(SurfaceView游戏框架).zip

    安卓Android源码——(SurfaceView游戏框架).zip

    SurfaceView小例子

    一个丢西瓜的例子,可以对surfaceSurface、SurfaceHolder及SurfaceHolder.Callback有所理解

    安卓Android源码——(SurfaceView游戏框架).rar

    安卓Android源码——(SurfaceView游戏框架).rar

    Android实现跳动的小球加载动画效果

    先来看看效果图 跳动的小球做这个动画,需掌握:  1、属性动画  2、Path类、Canvas类 ...public class DancingView extends SurfaceView implements SurfaceHolder.Callback { public static final int STAT

    Android 简单的照相机程序的实例代码

    代码如下:class surface extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder sfholder; Camera camera; Bitmap bitmap; public surface(Context context) { super(context); // TODO ...

    Android双SurfaceView底部拍照,顶部绘图

    Android双SurfaceView底部拍照,顶部绘图,当SurfaceHolder对象的类型设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS时就只能拍照不能绘制了。为了既能通过SurfaceView拍照又能在上面绘制图形,可以通过双...

    画布上显示的控件

    canvas = sfh.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); paint.setTextSize(15); canvas.drawText("这里是游戏视图-SurfaceView", 40, 40, paint); } } catch (Exception e) { /...

Global site tag (gtag.js) - Google Analytics