I recently upgraded to Android 4.4 and someone of the features of my app have surprisingly stopped working.
I have this code for initializing and then drawing my custom view. The basic idea is it adjusts the zoom level so the entire view fits on the screen.
private void initAtZoomLevel(float zoomLevel){
....
Matrix transformMatrix = new Matrix();
transformMatrix.setScale(initialZoomLevel, initialZoomLevel);
float yTransCenter = (screenHeight - mapHeight)/2.0f;
setImageMatrix(transformMatrix);
}
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
float[] values = new float[9];
getImageMatrix().getValues(values);
scaleFactor = values[0];
....
}
THIS WORKS ON ANDROID 4.1.2, and 4.2.2 DEVICES I HAVE
But on Android 4.4/4.3 getImageMatrix().getValues(values)
stopped working!
It returns an identity matrix instead of the transform matrix I expect on app start up!
DEBUG PRINT-OUT:
4.1.2: @setImageMatrix(transformMatrix)
: transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 566.5][0.0, 0.0, 1.0]}
@getImageMatrix().getValues(values)
: transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 566.5][0.0, 0.0, 1.0]}
4.4: @setImageMatrix(transformMatrix)
: transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 553.0][0.0, 0.0, 1.0]}
@getImageMatrix().getValues(values)
: transformMatrix = Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}
I've looked around and I can't seem to find any documentation on this. Somehow the image matrix for my view is being reset; has Android 4.4 changed the way we are supposed to do this? Has anyone else run in to this problem?
note: the problem appears to have originated on Android 4.3 - the same problem occurs running on an emulator
UPDATE: I have checked the change log from 4.2 to 4.3, but there is nothing on there I can see above the Matrix Class, or anything relevant to the View class.
UPDATE 2: My pinch-to-zoom is also not working, which uses the same setImageMatrix()
method - and it's clearly not sticking because nothing happens in getImageMatrix().getValues()
I have found what I believe to be the problem. I took a look at the source code for
ImageView
and discovered thesetImageMatrix(Matrix matrix)
is saving the matrix in a different field thangetImageMatrix()
is returning...Android 4.4 ImageView
Here the matrix is being stored in the field mMatrix
While
getImageMatrix()
returns mDrawMatrix...Android 4.1.2 ImageView
both methods use the same field - mMatrix
So there's the problem right there --- all of a sudden
getImageMatrix()
is returning the wrong field...While my previous answer does outline the overall problem, it in fact might not be a bug. As pointed out by Generic Holiday Name,
mDrawMatrix
should be set tomMatrix
in theconfigureBounds()
method - which would eliminate this problem/bug/whatever.HOWEVER, I had to add several lines of code to get
configureBounds()
to actually work:So, in order to actually get this to work the way I expect with 4.2 and below you need to make sure:
mDrawable != null
. This wasn't a problem before, but for my case I wasn't using a drawable so everything was failing (thereturn
statement was hit right away)'dwidth >0 && dheight >0
. This isn't a problem if you have a real drawable, but like I said, I didn't.mHaveFrame = true
. I had no idea what this was - never used it. The only way to set this to true is by callingsetFrame(int, int, int, int)
.To get my scaling code to work again, I had to add the following:
YIKES