清楚地理解matrix计算

我有这个代码片段。 我不明白matrix.prescale()和传递matrix的createBitmap。 这是什么意思? 有没有任何模拟网站了解matrix计算? 你能给我一些关于graphicsmath的网站吗? 对不起,我不擅长math。 🙂

public Bitmap createReflectedImages(final Bitmap originalImage) { final int width = originalImage.getWidth(); final int height = originalImage.getHeight(); final Matrix matrix = new Matrix(); matrix.preScale(1, -1); final Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, (int) (height * imageReflectionRatio), width, (int) (height - height * imageReflectionRatio), matrix, false); final Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (int) (height + height * imageReflectionRatio + 400), Config.ARGB_8888); final Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(originalImage, 0, 0, null); final Paint deafaultPaint = new Paint(); deafaultPaint.setColor(color.transparent); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); final Paint paint = new Paint(); final LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } 

Solutions Collecting From Web of "清楚地理解matrix计算"

不要太想它,至less不是在早期阶段。

只要把一个matrix看作一个数组的数组。 在这种情况下,Androidmatrix有3行3个数字。 每个数字告诉一个Androidgraphics函数要做什么来缩放(更大/更小),平移(移动),旋转(旋转)或扭曲(在2D平面中扭曲)matrix所应用的“事物”。

matrix看起来像这样(见这里的文档 )。

 {Scale X, Skew X, Transform X Skew Y, Scale Y, Transform Y Perspective 0, Perspective 1, Perspective 2} 

好消息是,你不需要知道任何matrixmath,实际上几乎没有math,在Android中使用matrix。 这就是preScale()这样的方法。 要了解背后的math并不难,对于大多数事情你只需要增加,乘数和SOHCAHTOA 。

matrix变换为最math上不便/

当您阅读Matrix文档时,您将看到旋转,翻译等方法,前缀为“set”,“post”或“pre”。

想象一下,你创build一个新的matrix。 然后使用setRotate()来设置matrix进行旋转。 然后使用preTranslate()来进行翻译。 因为你使用了“pre”,所以翻译发生在旋转之前。 如果您使用“发布”,轮换将首先发生。 'set'清除matrix中的任何内容并重新开始。

为了回答你的具体问题,新的Matrix()创build了“身份matrix”

 {1, 0, 0 0, 1, 0 0, 0, 1} 

其缩放1(因此相同的大小),并没有翻译,旋转或歪斜。 因此,应用身份matrix将无济于事。 下一个方法是应用于这个单位matrix的preScale(),在你已经显示的情况下,产生一个可缩放的matrix,除此之外,也可以使用setScale()或postScale()来完成。

希望这可以帮助。