TextureView canvas drawing problems

Showing 1-6 of 6 messages
TextureView canvas drawing problems Conrad Chapman 10/2/12 7:40 AM
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.
Re: [android-developers] TextureView canvas drawing problems Romain Guy 10/3/12 3:04 PM
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.
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-d...@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscribe@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en



--
Romain Guy
Android framework engineer
roma...@android.com
Re: [android-developers] TextureView canvas drawing problems Romain Guy 10/3/12 3:06 PM
Here is a fully working example of Canvas & TextureView:

http://pastebin.com/J4uDgrZ8
Re: [android-developers] TextureView canvas drawing problems Conrad Chapman 10/4/12 8:17 AM
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
Re: [android-developers] TextureView canvas drawing problems Conrad Chapman 10/16/12 8:31 AM
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!
Re: [android-developers] TextureView canvas drawing problems zhu hui 10/21/12 11:41 PM
Hi All:

I have tried this sample, it works great. But when I change lockCanvas(null) into lockCanvas(new Rect(x, y, x+20, y+20)), the example starts to flicker.
It seems 'lockCanvas(Rect)' can not work well for TextureView or any other reasons?

I am using Motorola XOOM with android 4.0.3.
Thanks for any help!

在 2012年10月4日星期四UTC+8上午6时06分00秒,Romain Guy (Google)写道: