代码之家  ›  专栏  ›  技术社区  ›  Namratha

子类化SurfaceView并重写onDraw()以更改SurfaceView参数以生成所需大小的预览

  •  3
  • Namratha  · 技术社区  · 16 年前

    我已经对SurfaceView进行了子类化,并在活动的onCreate中对其进行了实例化。预览已生成,但控件从未进入onDraw(),后者在SurfaceView的子类中被重写。为什么呢?

    class ActivityClass extends Activity{
    
        onCreate(){
    
            mPreview = new Preview(this);
            setContentView(mPreview);
        }
        public void startPreview(){
    
            rec = new MediaRecorder();
            rec.setVideoSource();.......
            rec.setPreviewDisplay(mPreview.getSurfaceHolder.getSurface());
        } 
    }
    
    class Preview extends SurfaceView implements SurfaceHolder.Callback{
    
        SurfaceHolder mHolder;
    
        public Preview(Context context){
            super(context);
            mHolder = getHolder();     
            mHolder.addCallback(this);      
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
            bringToFront();//this is not
            invalidate();//making a difference
        }
    
        SurfaceHolder getSurfaceHolder(){
    
            return mHolder;
        }
        //Surface callback methods implemented here
    }
    

    因为onDraw回调对Android框架说“你不绘制视图。我将画它,因为我已经实现了'。我说得对吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Jay Vyas    12 年前

    您只需添加

    setWillNotDraw(false)
    

    给构造器。

    完成了……)

        2
  •  0
  •   Habibur Rahman    15 年前
    public class SelectedRect extends View {
        public SelectedRect(Context context) {
            super(context);     
            bringToFront();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            drawLine(canvas);
            invalidate();       
            this.bringToFront();    
        }
    }
    

    View rect =  new SelectedRect(this);
    rect.bringToFront();
    this.addView(rect, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.FILL_PARENT));
    
        3
  •  0
  •   aleph_null    14 年前

    有些可疑的事情正在发生。似乎您正在尝试将SurfaceView设置为预览显示。在这种情况下,活动应该实现SurfaceHolder.Callback(而不是SurfaceView)。这样,活动就可以知道何时已创建SurfaceView并准备好进行绘制。此外,甚至不需要扩展SurfaceView:您应该能够使用SurfaceView本身。

    假设我误解了你,你真的想出于某种原因扩展surfaceview。。。 我看不出你在预习课上在哪里超越了onDraw。您没有包含此代码吗?