下面列出了android.graphics.Matrix#MSKEW_X 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
void seamlesslyRotate(SurfaceControl.Transaction t, int oldRotation, int newRotation) {
final WindowState w = mWin;
// We rotated the screen, but have not received a new buffer with the correct size yet. In
// the mean time, we rotate the buffer we have to the new orientation.
final Matrix transform = mService.mTmpTransform;
transformToRotation(oldRotation, newRotation, w.mFrame.width(), w.mFrame.height(),
transform);
transform.getValues(mService.mTmpFloats);
float DsDx = mService.mTmpFloats[Matrix.MSCALE_X];
float DtDx = mService.mTmpFloats[Matrix.MSKEW_Y];
float DtDy = mService.mTmpFloats[Matrix.MSKEW_X];
float DsDy = mService.mTmpFloats[Matrix.MSCALE_Y];
float nx = mService.mTmpFloats[Matrix.MTRANS_X];
float ny = mService.mTmpFloats[Matrix.MTRANS_Y];
mSurfaceController.setPosition(t, nx, ny, false);
mSurfaceController.setMatrix(t, DsDx * w.mHScale, DtDx * w.mVScale, DtDy
* w.mHScale, DsDy * w.mVScale, false);
}
/**
* android.graphics.Matrixの3x3行列をOpenGLの4x4(列優先)行列に変換する
* (アフィン変換のみ)
* |a11 a12 a13| |0 1 2| |a11 a12 0 a13| |0 4 8 12|
* |a21 a22 a23| |3 4 5| |a21 a22 0 a23| |1 5 9 13|
* |a31 a32 a33| |6 7 8| => | 0 0 1 0| |2 6 10 14|
* |a31 a32 0 a33| |3 7 11 15|
* @param transform
* @param result
* @return
*/
@NonNull
@Size(min=16)
public static float[] toGLMatrix(@NonNull final Matrix transform,
@NonNull @Size(min=16) final float[] result,
@NonNull @Size(min=9) final float[] aMatrix) {
transform.getValues(aMatrix);
result[ 0] = aMatrix[Matrix.MSCALE_X];
result[ 1] = aMatrix[Matrix.MSKEW_Y];
result[ 2] = 0;
result[ 3] = aMatrix[Matrix.MPERSP_0];
result[ 4] = aMatrix[Matrix.MSKEW_X];
result[ 5] = aMatrix[Matrix.MSCALE_Y];
result[ 6] = 0;
result[ 7] = aMatrix[Matrix.MPERSP_1];
result[ 8] = 0;
result[ 9] = 0;
result[10] = 1;
result[11] = 0;
result[12] = aMatrix[Matrix.MTRANS_X];
result[13] = aMatrix[Matrix.MTRANS_Y];
result[14] = 0;
result[15] = aMatrix[Matrix.MPERSP_2];
return result;
}
/**
* OpenGLの4x4(列優先)行列をandroid.graphics.Matrixの3x3行列に変換する
* (アフィン変換のみ)
* @param transform
* @param result
* @param aMatrix
* @return
*/
public static Matrix toAndroidMatrix(
@NonNull @Size(min=16)final float[] transform,
@NonNull final Matrix result,
@NonNull @Size(min=9) final float[] aMatrix) {
aMatrix[Matrix.MSCALE_X] = transform[ 0];
aMatrix[Matrix.MSKEW_Y] = transform[ 1];
aMatrix[Matrix.MPERSP_0] = transform[ 3];
aMatrix[Matrix.MSKEW_X] = transform[ 4];
aMatrix[Matrix.MSCALE_Y] = transform[ 5];
aMatrix[Matrix.MPERSP_1] = transform[ 7];
aMatrix[Matrix.MTRANS_X] = transform[12];
aMatrix[Matrix.MTRANS_Y] = transform[13];
aMatrix[Matrix.MPERSP_2] = transform[15];
result.setValues(aMatrix);
return result;
}
/**
* 从 {@link Matrix} 中获取旋转角度
*/
public static int getMatrixRotateDegrees(@NonNull Matrix matrix) {
synchronized (MATRIX_VALUES) {
matrix.getValues(MATRIX_VALUES);
final float skewX = MATRIX_VALUES[Matrix.MSKEW_X];
final float scaleX = MATRIX_VALUES[Matrix.MSCALE_X];
final int degrees = (int) Math.round(Math.atan2(skewX, scaleX) * (180 / Math.PI));
if (degrees < 0) {
return Math.abs(degrees);
} else if (degrees > 0) {
return 360 - degrees;
} else {
return 0;
}
}
}
public static float[] LoadGraphicsMatrix(Matrix matrix) {
float m[] = new float[16];
float v[] = new float[9];
matrix.getValues(v);
m[0] = v[Matrix.MSCALE_X]; //m.a;
m[1] = v[Matrix.MSKEW_X]; //m.b;
m[2] = 0.0f;
m[3] = 0.0f;
m[4] = v[Matrix.MSKEW_Y]; //m.c;
m[5] = v[Matrix.MSCALE_Y]; //m.d;
m[6] = 0.0f;
m[7] = 0.0f;
m[8] = 0.0f;
m[9] = 0.0f;
m[10] = 1.0f;
m[11] = 0.0f;
m[12] = v[Matrix.MTRANS_X]; //m.tx;
m[13] = v[Matrix.MTRANS_Y]; //m.ty;
m[14] = 0.0f;
m[15] = 1.0f;
return m;
}
private void syncCharts() {
Matrix srcMatrix;
float[] srcVals = new float[9];
Matrix dstMatrix;
float[] dstVals = new float[9];
// get src chart translation matrix:
srcMatrix = srcChart.getViewPortHandler().getMatrixTouch();
srcMatrix.getValues(srcVals);
// apply X axis scaling and position to dst charts:
for (Chart dstChart : dstCharts) {
dstMatrix = dstChart.getViewPortHandler().getMatrixTouch();
dstMatrix.getValues(dstVals);
dstVals[Matrix.MSCALE_X] = srcVals[Matrix.MSCALE_X];
dstVals[Matrix.MSKEW_X] = srcVals[Matrix.MSKEW_X];
dstVals[Matrix.MTRANS_X] = srcVals[Matrix.MTRANS_X];
dstVals[Matrix.MSKEW_Y] = srcVals[Matrix.MSKEW_Y];
dstVals[Matrix.MSCALE_Y] = srcVals[Matrix.MSCALE_Y];
dstVals[Matrix.MTRANS_Y] = srcVals[Matrix.MTRANS_Y];
dstVals[Matrix.MPERSP_0] = srcVals[Matrix.MPERSP_0];
dstVals[Matrix.MPERSP_1] = srcVals[Matrix.MPERSP_1];
dstVals[Matrix.MPERSP_2] = srcVals[Matrix.MPERSP_2];
dstMatrix.setValues(dstVals);
dstChart.getViewPortHandler().refresh(dstMatrix, dstChart, true);
}
}
public void syncCharts() {
if (dstCharts == null) {
return;
}
Matrix srcMatrix;
float[] srcVals = new float[9];
Matrix dstMatrix;
float[] dstVals = new float[9];
// get src chart translation matrix:
srcMatrix = srcChart.getViewPortHandler().getMatrixTouch();
srcMatrix.getValues(srcVals);
// apply X axis scaling and position to dst charts:
for (Chart dstChart : dstCharts) {
if (dstChart.getVisibility() == View.VISIBLE) {
dstMatrix = dstChart.getViewPortHandler().getMatrixTouch();
dstMatrix.getValues(dstVals);
dstVals[Matrix.MSCALE_X] = srcVals[Matrix.MSCALE_X];
dstVals[Matrix.MSKEW_X] = srcVals[Matrix.MSKEW_X];
dstVals[Matrix.MTRANS_X] = srcVals[Matrix.MTRANS_X];
dstVals[Matrix.MSKEW_Y] = srcVals[Matrix.MSKEW_Y];
dstVals[Matrix.MSCALE_Y] = srcVals[Matrix.MSCALE_Y];
dstVals[Matrix.MTRANS_Y] = srcVals[Matrix.MTRANS_Y];
dstVals[Matrix.MPERSP_0] = srcVals[Matrix.MPERSP_0];
dstVals[Matrix.MPERSP_1] = srcVals[Matrix.MPERSP_1];
dstVals[Matrix.MPERSP_2] = srcVals[Matrix.MPERSP_2];
dstMatrix.setValues(dstVals);
dstChart.getViewPortHandler().refresh(dstMatrix, dstChart, true);
}
}
}
public static float[] LoadGraphicsMatrix(Matrix matrix) {
float m[] = new float[16];
float v[] = new float[9];
matrix.getValues(v);
m[0] = v[Matrix.MSCALE_X]; //m.a;
m[1] = v[Matrix.MSKEW_X]; //m.b;
m[2] = 0.0f;
m[3] = 0.0f;
m[4] = v[Matrix.MSKEW_Y]; //m.c;
m[5] = v[Matrix.MSCALE_Y]; //m.d;
m[6] = 0.0f;
m[7] = 0.0f;
m[8] = 0.0f;
m[9] = 0.0f;
m[10] = 1.0f;
m[11] = 0.0f;
m[12] = v[Matrix.MTRANS_X]; //m.tx;
m[13] = v[Matrix.MTRANS_Y]; //m.ty;
m[14] = 0.0f;
m[15] = 1.0f;
return m;
}
public void syncCharts() {
Matrix srcMatrix;
float[] srcVals = new float[9];
Matrix dstMatrix;
float[] dstVals = new float[9];
// get src chart translation matrix:
srcMatrix = srcChart.getViewPortHandler().getMatrixTouch();
srcMatrix.getValues(srcVals);
// apply X axis scaling and position to dst charts:
for (Chart dstChart : dstCharts) {
dstMatrix = dstChart.getViewPortHandler().getMatrixTouch();
dstMatrix.getValues(dstVals);
dstVals[Matrix.MSCALE_X] = srcVals[Matrix.MSCALE_X];
dstVals[Matrix.MSKEW_X] = srcVals[Matrix.MSKEW_X];
dstVals[Matrix.MTRANS_X] = srcVals[Matrix.MTRANS_X];
dstVals[Matrix.MSKEW_Y] = srcVals[Matrix.MSKEW_Y];
dstVals[Matrix.MSCALE_Y] = srcVals[Matrix.MSCALE_Y];
dstVals[Matrix.MTRANS_Y] = srcVals[Matrix.MTRANS_Y];
dstVals[Matrix.MPERSP_0] = srcVals[Matrix.MPERSP_0];
dstVals[Matrix.MPERSP_1] = srcVals[Matrix.MPERSP_1];
dstVals[Matrix.MPERSP_2] = srcVals[Matrix.MPERSP_2];
dstMatrix.setValues(dstVals);
dstChart.getViewPortHandler().refresh(dstMatrix, dstChart, true);
}
}
public static float[] LoadGraphicsMatrix(Matrix matrix) {
float m[] = new float[16];
float v[] = new float[9];
matrix.getValues(v);
m[0] = v[Matrix.MSCALE_X]; //m.a;
m[1] = v[Matrix.MSKEW_X]; //m.b;
m[2] = 0.0f;
m[3] = 0.0f;
m[4] = v[Matrix.MSKEW_Y]; //m.c;
m[5] = v[Matrix.MSCALE_Y]; //m.d;
m[6] = 0.0f;
m[7] = 0.0f;
m[8] = 0.0f;
m[9] = 0.0f;
m[10] = 1.0f;
m[11] = 0.0f;
m[12] = v[Matrix.MTRANS_X]; //m.tx;
m[13] = v[Matrix.MTRANS_Y]; //m.ty;
m[14] = 0.0f;
m[15] = 1.0f;
return m;
}
public static float[] LoadGraphicsMatrix(Matrix matrix) {
float m[] = new float[16];
float v[] = new float[9];
matrix.getValues(v);
m[0] = v[Matrix.MSCALE_X]; //m.a;
m[1] = v[Matrix.MSKEW_X]; //m.b;
m[2] = 0.0f;
m[3] = 0.0f;
m[4] = v[Matrix.MSKEW_Y]; //m.c;
m[5] = v[Matrix.MSCALE_Y]; //m.d;
m[6] = 0.0f;
m[7] = 0.0f;
m[8] = 0.0f;
m[9] = 0.0f;
m[10] = 1.0f;
m[11] = 0.0f;
m[12] = v[Matrix.MTRANS_X]; //m.tx;
m[13] = v[Matrix.MTRANS_Y]; //m.ty;
m[14] = 0.0f;
m[15] = 1.0f;
return m;
}
public static float getXSkew(Matrix matrix){
float[] f = new float[9];
matrix.getValues(f);
return f[Matrix.MSKEW_X];
}