当前位置: 首页 > 编程笔记 >

Android中使用Matrix控制图形变换和制作倒影效果的方法

轩辕越泽
2023-03-14
本文向大家介绍Android中使用Matrix控制图形变换和制作倒影效果的方法,包括了Android中使用Matrix控制图形变换和制作倒影效果的方法的使用技巧和注意事项,需要的朋友参考一下

最近在使用Matrix进行绘图的操作。对Matrix的一些方法有了一些更深的体会,记下来,以便日后复习。
Matrix常用的方法:

一、变换方法:

Matrix提供了translate(平移)、rotate(旋转)、scale(缩放)、skew(倾斜)四种操作,这四种操作的内部实现过程都是通过matrix.setValues(…)来设置矩阵的值来达到变换图片的效果。
Matrix的每种操作都有set、pre、post三种操作,set是清空队列再添加,pre是在队列最前面插入,post是在队列最后面插入。
pre方法表示矩阵前乘,例如:变换矩阵为A,原始矩阵为B,pre方法的含义即是A*B
post方法表示矩阵后乘,例如:变换矩阵为A,原始矩阵为B,post方法的含义即是B*A

1.matrix.preScale(0.5f, 1);  
2.matrix.preTranslate(10, 0); 
3.matrix.postScale(0.7f, 1);   
4.matrix.postTranslate(15, 0); 
等价于:
translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)
注意:后调用的pre操作先执行,而后调用的post操作则后执行。

set方法一旦调用即会清空之前matrix中的所有变换,例如:
1.matrix.preScale(0.5f, 1);  
2.matrix.setScale(1, 0.6f);  
3.matrix.postScale(0.7f, 1);  
4.matrix.preTranslate(15, 0); 
等价于
translate(15, 0) -> scale(1, 0.6f) ->  scale(0.7f, 1)

matrix.preScale (0.5f, 1)将不起作用。

二、映射方法   

Matrix提供了mapXXX的方法,用于获取经matrix映射之后的值。主要有:mapPoints,mapRects,mapVectors等方法。
这些方法你会使用到:在你需要记住matrix操作之后的数值的时候。比如:记住矩形旋转34°(rotate)之后四个点的坐标。(你可以尝试着自己计算,你会发现很复杂,还不精确)

需要注意的是,matrix的某些方法使用到中心点的时候,如果不设置,默认是以(0,0)为中心点的。

记下来,以免忘记。


三、制作倒影效果
利用matrix可以实现各种图片的特效,接下来就用marix加上渐变色实现图片倒影的效果,步骤如下:
1. 获取需要倒影效果的图片,这里取原图片的一半
2. 添加颜色渐变到倒影图片上
具体的实现如下面代码所述,我们以一种自定义view的形式给出效果图,代码如下:

package com.flection.view;
 
import com.flection.main.R;
 
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.View;
 
public class FlectionView extends View {
 
  Context mContext=null;
  public FlectionView(Context context) {
    super(context);
  }
 
  public FlectionView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.mContext=context;
  }
 
  @SuppressLint("DrawAllocation")
  @Override
  protected void onDraw(Canvas canvas) {
    //设置背景色
    this.setBackgroundColor(Color.parseColor("#8B8378"));
    Bitmap oldBitmap = BitmapFactory.decodeResource(mContext.getResources(),R.drawable.dropbox);
    Bitmap newBitmap = createFlectionBitmap(oldBitmap);
    canvas.drawBitmap(newBitmap,newBitmap.getWidth() ,newBitmap.getHeight(), new Paint());
    this.invalidate();
  }
 
  //获取原图+倒影图的bitmap
  private Bitmap createFlectionBitmap(Bitmap oldBitmap) {
    int mWidth = oldBitmap.getWidth();
    int mHeight = oldBitmap.getHeight();
    //原图和倒影图之间的缝隙
    int gap = 2;
    Matrix matrix = new Matrix();
    matrix.preScale(1, -1);
    Bitmap flection = Bitmap.createBitmap(oldBitmap, 0, mHeight / 2,
        mWidth, mHeight / 2, matrix, false);
    Bitmap background = Bitmap.createBitmap(mWidth, mHeight+gap+mHeight/2, Config.ARGB_8888);
    Canvas canvas = new Canvas(background);
    Paint p1 = new Paint();
    //画出原图
    canvas.drawBitmap(oldBitmap, 0, 0, p1);
    //画出倒影图
    canvas.drawBitmap(flection, 0, mHeight+gap, p1);
    Paint shaderPaint = new Paint();
    LinearGradient shader = new LinearGradient(0, mHeight, 0,
        flection.getHeight(), 0x70ffffff, 0x00ffffff, TileMode.MIRROR);
    shaderPaint.setShader(shader);
    shaderPaint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN));
    //画出渐变颜色
    canvas.drawRect(0, mHeight+gap, mWidth, background.getHeight(), shaderPaint);
    return background;
  }
 
}

实现的效果如下图:

 类似资料:
  • 在CSS3之前,要在网页中使用倒影效果,只能事先使用 photoshop 将倒影设计好,然后导入到网页中,这不但耗费资源,而且影响开发的效率。 CSS3中,新增了 box-reflect属性,通过该属性为元素添加倒影效果。语法格式为: box-reflect:<direction> <offset>? <mask-box-image>? 也就是说,在 box-reflect属性中,通过 dire

  • 本文向大家介绍Android编程实现文字倒影效果的方法,包括了Android编程实现文字倒影效果的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程实现文字倒影效果的方法。分享给大家供大家参考,具体如下: 我们所有的view都继承自View类,View类里有个方法叫ondraw(). 即,我们看到的界面都是画出来的,所以我们可以重写ondraw()方法。 既然知道了这点

  • 在我的Android应用程序,我需要变形的图像从一个点到另一个点。看起来应该是那样的 原点A和B是A的新位置 我尝试使用“drawBitmapMesh”函数使其成为可能,但没有达到,以下是包装代码: 公共空隙扭曲(浮动起点TX、浮动起点、浮动终点X、浮动终点Y){

  • 本文向大家介绍Android使用Canvas绘制圆形进度条效果,包括了Android使用Canvas绘制圆形进度条效果的使用技巧和注意事项,需要的朋友参考一下 前言 Android自定义控件经常会用到Canvas绘制2D图形,在优化自己自定义控件技能之前,必须熟练掌握Canvas绘图机制。本文从以下三个方面对Canvas绘图机制进行讲解: 画布Canvas 画笔Paint 示例圆形进度条 画布Ca

  • 本文向大家介绍Android实现图片阴影效果的方法,包括了Android实现图片阴影效果的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例介绍了Android实现图片阴影效果,设置画布颜色,图像倾斜效果,图片阴影效果的方法,采用canvas.save(Canvas.MATRIX_SAVE_FLAG);来实现。由于图片的实际尺寸比显示出来的图像要大一些,因此需要适当更改下大小,以达到较好的效果

  • 利用操控变形功能,您可以扭转和扭曲图稿的某些部分,使变换看起来更自然。您可以使用 Illustrator 中的操控变形工具添加、移动和旋转点,以便将您的图稿平滑地转换到不同的位置以及变换成不同的姿态。 选择要变换的图稿。 从工具栏中选择“操控变形”工具。 默认情况下,Illustrator 可识别用于变换图稿的相应区域,并自动向图稿中添加多个字,以便通过最合适的方式来对图稿进行变形。选择操控变形工

  • 我想读取数据并绘制动态图,所以我学习了使用PyQt5的matplotlib。我找到了一个例子,但它是针对PyQt4的。我将其修改为PyQt5,但它有一些问题,当我单击开始按钮时,它显示错误 回溯(最后一次调用):文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/matplotlib/ba

  • Drawing attractive figures is important. When making figures for yourself, as you explore a dataset, it’s nice to have plots that are pleasant to look at. Visualizations are also central to communicat