создание подклассов SurfaceView и переопределение onDraw () для изменения параметров SurfaceView для создания предварительного просмотра желаемого размера - PullRequest
3 голосов
/ 27 июля 2010

Я создал подкласс SurfaceView и создал его в onCreate of Activity.Предварительный просмотр создается, но элемент управления никогда не входит в 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, если он реализован?

Поскольку обратный вызов onDraw говорит платформе Android «вы не рисуете представление.Я нарисую его, так как я был реализован ».Я прав?

Почему же тогда элемент управления не может войти в onDraw ()?Пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 10 февраля 2014

Вы просто должны добавить

setWillNotDraw(false)

к конструктору.

И все готово ..:)

0 голосов
/ 23 октября 2011

Что-то подозрительное происходит. Похоже, вы пытаетесь установить SurfaceView в качестве предварительного просмотра. В этом случае Activity должен реализовывать SurfaceHolder.Callback (не SurfaceView). Это делается для того, чтобы Activity могла знать, когда SurfaceView был создан и готов к рисованию. Кроме того, даже не нужно расширять SurfaceView: вы должны иметь возможность самостоятельно использовать SurfaceView.

Предполагая, что я неправильно понял, и вы действительно хотите расширить поверхность обзора по некоторым причинам ... Я не вижу, где вы переопределили onDraw в вашем классе Preview. Вы не включили этот код?

Когда вы говорите, что обратный вызов onDraw сообщает android ', вы не рисуете представление. Я нарисую его, так как я был реализован », я не согласен. onDraw - это функция, в которой View рисует вещи, которые есть у всех представлений, например фон. SurfaceView расширяет вид. Когда вы расширяете SurfaceView, вы можете переопределить onDraw, чтобы сказать android рисовать вещи в дополнение к тому, что рисует оригинальный onDraw в View. Другими словами, Android всегда делает все рисование; переопределение onDraw просто говорит ему рисовать еще несколько вещей, когда это подходящее время для рисования.

0 голосов
/ 27 июля 2010
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));
...