android:照片涂画功能实现过程及原理详解

2019-12-10 20:09:53于丽

这个时候,我们需要将两个坐标系进行映射,通过偏移对齐坐标系。偏移多少?这时候该使用矩阵的translate值了。这样我们就可以知道图片在坐标系上的偏移了,随边你怎么移动坐标都能准确对齐。

 

复制代码
private HashMap getImageViewIneerSize(ImageView iv){
    HashMap size=new HashMap();
    //获得ImageView中Image的变换矩阵 
    Matrix m = iv.getImageMatrix(); 
    float[] values = new float[10]; 
    m.getValues(values); 

    //Image在绘制过程中的变换矩阵,从中获得x和y方向的缩放系数 
    float sx = values[0]; 
    float sy = values[4];

 

    //计算Image在屏幕上实际绘制的宽高 
   size.put("scaleX",  1/sx); 
   size.put("scaleY",  1/sy); 
   size.put("offsetX", values[2]); //X轴的translate的值
   size.put("offsetY",values[5]);

   return size;
}

 

其中width=backImage.getDrawable().getBounds().width(); 

你会发现有个scaleX,这是干什么的?我们假设现在图片经过缩放后的宽度恰好等于屏幕宽度,图片的实际宽度是960px。但是我们在X=480px的地方画一个点,这个点应该显示在图片的什么地方呢?我们的意图是要在图片的最后面,即X=960px的地方画一个点,但是现在却跑到了480处,明显不满足要求。这时,就需要乘上上面的scaleX了。

画线的最终代码:

 

复制代码
/*根据两点坐标,绘制连线

 

 *startX、stopX 为触摸事件开始、结束的地方

 *offsetX,为图片在X轴的位移值

 *scaleX,为图片在X轴的缩放值的倒数

 */ 
if((startY-offsetY)>=0&&(stopY-offsetY)>=0)
    canvas.drawLine((startX-offsetX)*scaleX, (startY-offsetY)*scaleY, (stopX-offsetX)*scaleX, (stopY-offsetY)*scaleY, pen);