I looked at this more and Romain Guy unsurprisingly got it 100% right.
My code pasted here is wrong.
DO NOT add
setWillNotDraw(true); in the TextureView and
mSurface.updateTexImage(); in the drawing thread.
They will mess it up!
On Thursday, 4 October 2012 17:17:33 UTC+2, Conrad Chapman wrote:
>
> Thank you so much Romain for your reply and example. I might be the only
> real canvas textureview example on the net. It worked but not quite as you
> said. It might be something to do with my class structure as this part of
> the program does not have internal classes..
> I will explain and show a little. Maybe my approach is bad or wrong I
> don't know.
> CLASSES
> Main Activity
> spawns
> - CustomTextureView class extending TextureView
> -this spawns the worker thread (it does not extend thread
> but just a worker class)
>
> the TextureView constructor
>
> public CustomTextureView (Context context, AttributeSet attrs) {
> super(context, attrs);
> mContext = context;
> setWillNotDraw(true);
> setFocusableInTouchMode(true);
> setFocusable(true);
> setSurfaceTextureListener(this);
>
> }
> and the listener callback within this class
> @Override
> public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
> int height) {
> // TODO Auto-generated method stub
> isRunning = true;
> mSurface = surface;
> mChart.setTextureSurface(surface);//mChart is the worker class/thread
> mChart.setSurfaceSize(width, height);
> mChart.Redraw(true);//this does all the canvas drawing on a bitmap for
> buffering.
> invalidate();//this is essential to make it display on 1st run..why?
> }
>
> The worker class spawned from the CustomTextureView and the critical void
> protected void RenderCanvas(){
> final Canvas canvas = CustomTextureView .lockCanvas(null);
> try {
> canvas.drawBitmap(buffBitmap, 0, 0, null);
> } finally {
> CustomTextureView .unlockCanvasAndPost(canvas);
> mSurface.updateTexImage();
> }
> }
>
> So I do not work from the main activity and don't understand why I need to
> call invalidate() in onSurfaceTextureAvailable for the 1st run to display
> properly.
>
> Romain Guy you said NOT to call updateTexImage but if I don't my 2d chart
> does not update with the new buffBitmap when it is available.
> this I definitely don't understand????
>
> Anyway it works and thanks for putting me on the right track but am i
> still doing some android bad?
>
> C
>
> On Thursday, 4 October 2012 00:06:00 UTC+2, Romain Guy (Google) wrote:
>>
>> Here is a fully working example of Canvas & TextureView:
>>
>> http://pastebin.com/J4uDgrZ8
>>
>> On Wed, Oct 3, 2012 at 3:01 PM, Romain Guy <[email protected]> wrote:
>> > The problem is that you are calling updateTexImage() yourself. Do
>> > *not* do this. You are interfering with TextureView, preventing it
>> > from receiving the events that it uses to refresh the screen.
>> >
>> > On Tue, Oct 2, 2012 at 7:40 AM, Conrad Chapman <[email protected]>
>> wrote:
>> >> Also asked in StackOverflow here
>> >>
>> http://stackoverflow.com/questions/12688409/android-textureview-canvas-drawing-problems
>>
>> >>
>> >> I have an app that used SurfaceView to draw dynamic 2D graphs. It
>> worked ok
>> >> but transormations etc as we know are not supported. So I went to
>> >> TextureView. My old code used another class/thread to do the drawing
>> via the
>> >> Surfaceholder.lockCanvas(); So I changed this to
>> TextureView.lockcanvas.
>> >> When this runs the canvas is not accelerated (the view is). It does
>> not
>> >> display initially but if I touch the screen it displays??? The touch
>> is
>> >> handled by the main activity.
>> >>
>> >> Obviously it works as it will display eventually but why doesn't it
>> display
>> >> immediately?
>> >>
>> >> The TextureView class implements SurfaceTextureListener as such below.
>> >> @Override
>> >> public void onSurfaceTextureAvailable(SurfaceTexture surface, int
>> width,
>> >> int height) {
>> >> // TODO Auto-generated method stub
>> >> isRunning = true;
>> >> mySurface = surface;
>> >> mChart.setTextureSurface(surface);
>> >> mChart.setSurfaceSize(width, height);
>> >> mPaint.setColor(ZOOM_BUTTONS_COLOR);
>> >> //mySurface.setOnFrameAvailableListener(frameready);
>> >> mChart.Redraw(true);
>> >> }
>> >> @Override
>> >> public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
>> >> // TODO Auto-generated method stub
>> >> isRunning = false;
>> >> return false;
>> >> }
>> >> this block below also workswhen manipluating the view later on (pan
>> and
>> >> zoom)
>> >> public void Render(Bitmap buffmap){
>> >> //mCanvas = null;
>> >> post(new Runnable() {
>> >> public void run() {
>> >> invalidate();
>> >> mySurface.updateTexImage();
>> >> }
>> >> });
>> >>
>> >>
>> >> The drawing from the worker thread/class is
>> >> protected void RenderCanvas(){
>> >> //mCanvas = null;
>> >> Canvas c = null;
>> >> //synchronized (mCanvas) {
>> >> //mCanvas = null;
>> >> try {
>> >> c = mChartView.lockCanvas(null);
>> >>
>> >> synchronized (mCanvas) {
>> >> c.drawBitmap(buffBitmap, 0, 0, null);
>> >>
>> >> }
>> >> } finally {
>> >> if (c != null) {
>> >> mChartView.unlockCanvasAndPost(c);
>> >> }
>> >> }
>> >> mChartView.Render(null);
>> >> }
>> >>
>> >> Can I work like this? Non-GL content in a TextureView?
>> >> Please help desperate for an answer.
>> >>
>> >> --
>> >> You received this message because you are subscribed to the Google
>> >> Groups "Android Developers" group.
>> >> To post to this group, send email to [email protected]
>> >> To unsubscribe from this group, send email to
>> >> [email protected]
>> >> For more options, visit this group at
>> >> http://groups.google.com/group/android-developers?hl=en
>> >
>> >
>> >
>> > --
>> > Romain Guy
>> > Android framework engineer
>> > [email protected]
>>
>>
>>
>> --
>> Romain Guy
>> Android framework engineer
>> [email protected]
>>
>
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en