Android Matrix详解:2D变换的核心工具

4星 · 超过85%的资源 需积分: 50 13 下载量 199 浏览量 更新于2024-09-19 收藏 449KB PDF 举报
Android Matrix基础详解深入解析 在Android开发中,Matrix是一个关键的概念,尤其是在2D图形绘制和图像变换时。Matrix是线性代数的一个应用,它在Android.graphics包下的Matrix类中提供了一系列的方法,用于执行各种图形变换操作,如平移、缩放、旋转和倾斜等。 矩阵在Android中的应用始于其基础概念。一个3x3的Matrix可以被划分为四个部分:一个旋转部分、一个缩放部分、一个平移部分以及一个不参与变换的部分。理解这些部分的用途有助于我们更有效地使用Matrix。例如,要进行平移,只需修改右上角的两个元素;要实现缩放,涉及矩阵左上角的系数;而旋转则涉及旋转矩阵的前两个元素,如`setRotate(90)`函数所示,这对应于数学中的旋转变换。 在实际应用中,比如图像旋转,我们使用向量来计算旋转角度和新坐标。对于绕特定点旋转的情况,需要先移动到旋转中心,执行旋转,再移回原点。Android.graphics.Matrix提供了`setRotate()`方法,用于设置指定角度的旋转,并且使用浮点数表示,以实现精确的旋转效果。 学习如何在Android中使用Matrix,首先需熟悉矩阵运算的基本原理,如加法、乘法和逆运算。然后,结合API文档,掌握Matrix对象的创建、设置和使用方法,如`postTranslate()`, `preScale()`, `postRotate()`等。这些函数允许我们在绘制路径或位图时实时进行变换,为游戏开发、UI设计和动画制作提供强大支持。 理解并熟练运用Matrix,不仅能提升应用程序的性能,还能帮助开发者创建出更具交互性和视觉吸引力的用户体验。通过结合实际代码示例和理论知识,开发者可以更好地在Android应用中实现复杂的图形操作,提升项目的质量和创新性。

package com.blog.dragview; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.os.Bundle; import android.util.Log; import com.blog.R; import org.json.JSONArray; import org.json.JSONException; import java.util.List; public class MainActivity extends Activity{ private DrawingView _view; @Override protected void onCreate(Bundle savedInstanceState) { _view = new DrawingView(this); super.onCreate(savedInstanceState); setContentView(_view); Bitmap bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.hengzhegou); Bitmap bmp2 = BitmapFactory.decodeResource(getResources(),R.drawable.pie); CustomBitmap customBitmap1 = new CustomBitmap(bmp1); CustomBitmap customBitmap2 = new CustomBitmap(bmp2); customBitmap1.setId(1); customBitmap2.setId(2); if (getSavedMatrix(1) != null){ Log.e("tag", "matrix 1 is not null"); customBitmap1.setMatrix(getSavedMatrix(1)); } if (getSavedMatrix(2) != null){ Log.e("tag", "matrix 2 is not null"); customBitmap2.setMatrix(getSavedMatrix(2)); } _view.addBitmap(customBitmap1); _view.addBitmap(customBitmap2); } //����matrix private void saveMatrix(CustomBitmap customBitmap){ Log.e("tag", "save matrix" + customBitmap.getId()); SharedPreferences.Editor editor = getSharedPreferences("matrix", Context.MODE_PRIVATE).edit(); Matrix matrix = customBitmap.matrix; float[] values = new float[9]; matrix.getValues(values); JSONArray array = new JSONArray(); for (float value:values){ try { array.put(value); } catch (JSONException e) { e.printStackTrace(); } } editor.putString(String.valueOf(customBitmap.getId()), array.toString()); editor.commit(); Log.e("tag", "save matrix id:" + customBitmap.getId() + "---------"+values[Matrix.MPERSP_0] + " , " + values[Matrix.MPERSP_1] + " , " + values[Matrix.MPERSP_2] + " , " + values[Matrix.MSCALE_X] + " , " + values[Matrix.MSCALE_Y] + " , " + values[Matrix.MSKEW_X] + " , " + values[Matrix.MSKEW_Y] + " , " +values[Matrix.MTRANS_X] + " , " + values[Matrix.MTRANS_Y]); } //��ȡmatrix private Matrix getSavedMatrix(int id){ SharedPreferences sp = getSharedPreferences("matrix", Context.MODE_PRIVATE); String result = sp.getString(String.valueOf(id), null); if (result != null){ float[] values = new float[9]; Matrix matrix = new Matrix(); try { JSONArray array = new JSONArray(result); for (int i = 0; i < array.length(); i++) { values[i] = Float.valueOf(String.valueOf(array.getDouble(i))); } matrix.setValues(values); } catch (JSONException e) { e.printStackTrace(); } Log.e("tag", "get matrix id:" + id + "---------"+values[Matrix.MPERSP_0] + " , " + values[Matrix.MPERSP_1] + " , " + values[Matrix.MPERSP_2] + " , " + values[Matrix.MSCALE_X] + " , " + values[Matrix.MSCALE_Y] + " , " + values[Matrix.MSKEW_X] + " , " + values[Matrix.MSKEW_Y] + " , " +values[Matrix.MTRANS_X] + " , " + values[Matrix.MTRANS_Y]); return matrix ; } return null; } @Override public void finish() { List<CustomBitmap> list = _view.getViews(); for (CustomBitmap customBitmap:list){ saveMatrix(customBitmap); } super.finish(); } }

2023-06-05 上传