-
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个答案 按时间排序 按投票排序
-
采纳的答案
这个应该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
-
Canvas canvas = sfh.lockCanvas(null); //就是在这个地方报NULLPOINTEXCEPTION,我log了一下是因为canvas==null
如果这段代码NULLPOINTEXCEPTION,应该sfh是null,sfh在哪定义的,使用sfh=getHolder()了吗?2011年5月10日 10:57
相关推荐
SurfaceView + MediaPlayer 实现的视频播放器,支持横竖屏切换,手势快进快退、调节音量,亮度等。------代码简单,基础应用
surfaceView.getHolder() .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.getHolder().setFixedSize(176, 144); //设置Surface分辨率 surfaceView.getHolder().setKeepScreenOn(true);// ...
并为SurfaceView的SurfaceHolder添加Callback监听器。 3、调用MediaPlayer对象的setDisplay(Surfaceolder sh)将所播放的视频图像输出到指定的SurfaceView组件 4、调用MediaPlayer对象的start()、stop()、和pause...
自定义利用SurfaceView实现拍照.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个可以根据功能实际需要自己选择,我这里就直接在普通的用户界面调用SurfaceHolder的lockCanvas和unlockCanvasAndPost。 先来看看...
Class ScrollTextView extends SurfaceView implements SurfaceHolder.Callback Android 滚动字幕,如新闻联播下面的,可以使用在广告机,机顶盒,电视App等信息发布系统。 以前是在信息发布系统上使用过,作为动态...
基于android视频播放小案例
安卓开发-VIEW双缓冲与SurfaceView比较.zip.zip
Android 下载视频文件并自动播放,下载影片并播放,重新建构MediaPlayer对象,设定显示于SurfaceHolder,在线程运行中,调用自定义函数抓下文件,自定义setDataSource,由线程启动,若无法顺利取得扩展名,预设为....
写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个可以根据功能实际需要自己选择,本文所述方法就直接在普通的用户界面调用SurfaceHolder的lockCanvas和unlockCanvasAndPost。...
SurfaceHolder holder = surfaceView.getHolder(); holder.setFixedSize(1920, 1080); holder.setFormat(ImageFormat.YUV_420_888); holder.addCallback(this); } @Override public void surfaceCreated...
Step2:在界面布局文件中定义SurfaceView控件,或在程序中创建SurfaceView控件,并为SurfaceView的SurfaceHolder添加Callback监听器; Step3:调用MediaPlayer对象的setDisney(SurfaceHolder sh)方法将所播放的视频...
安卓Android源码——(SurfaceView游戏框架).zip
一个丢西瓜的例子,可以对surfaceSurface、SurfaceHolder及SurfaceHolder.Callback有所理解
安卓Android源码——(SurfaceView游戏框架).rar
先来看看效果图 跳动的小球做这个动画,需掌握: 1、属性动画 2、Path类、Canvas类 ...public class DancingView extends SurfaceView implements SurfaceHolder.Callback { public static final int STAT
代码如下:class surface extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder sfholder; Camera camera; Bitmap bitmap; public surface(Context context) { super(context); // TODO ...
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) { /...