注: 这里说的图片的平移和缩放不是对ImageView整个view进行的,而是对ImageView里面的图片进行的(view本身没有什么变化),所以Android自带的动画效果不能满足需求。
**功能点**:
1、一开始可以像centerCrop一样显示图片(觉得scaleType为centerCrop时显示效果比较好,图片会铺满整个View,而且图片本身的分辨率不变)
2、对ImageView里的图片平移或放大
3、将这个平移或放大做成一个动画效果
**一、在ScaleType为matrix的情况下实现centerCrop的显示效果**
要充分利用Android的源码,看ImageView的源代码就可以简单很多,在configureBounds()方法中:

不过为了之后的平移,要保证图片的宽度比View的宽度大
<span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setImage </span><span class="pun">(</span> <span class="typ">Drawable</span><span class="pln"> drawable </span><span class="pun">)</span> <span class="pun">{</span>
<span class="kwd">if</span> <span class="pun">(</span> <span class="kwd">null</span> <span class="pun">==</span><span class="pln"> drawable </span><span class="pun">)</span> <span class="kwd">return</span><span class="pun">;</span>
<span class="kwd">int</span><span class="pln"> dwidth </span><span class="pun">=</span><span class="pln"> drawable</span><span class="pun">.</span><span class="pln">getIntrinsicWidth </span><span class="pun">();</span>
<span class="kwd">int</span><span class="pln"> dheight </span><span class="pun">=</span><span class="pln"> drawable</span><span class="pun">.</span><span class="pln">getIntrinsicHeight </span><span class="pun">();</span>
<span class="kwd">int</span><span class="pln"> vwidth </span><span class="pun">=</span><span class="pln"> mWidth</span><span class="pun">;</span>
<span class="kwd">int</span><span class="pln"> vheight </span><span class="pun">=</span><span class="pln"> mHeight</span><span class="pun">;</span>
<span class="kwd">float</span><span class="pln"> scale </span><span class="pun">=</span> <span class="lit">1.0f</span><span class="pun">;</span>
<span class="kwd">float</span><span class="pln"> dx </span><span class="pun">=</span> <span class="lit"></span><span class="pun">,</span><span class="pln"> dy </span><span class="pun">=</span> <span class="lit"></span><span class="pun">;</span>
<span class="kwd">if</span> <span class="pun">(</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> vheight </span><span class="pun">></span><span class="pln"> vwidth </span><span class="pun">*</span><span class="pln"> dheight </span><span class="pun">)</span> <span class="pun">{</span>
<span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vheight </span><span class="pun">/</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> dheight</span><span class="pun">;</span>
<span class="pln"> dx </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vwidth </span><span class="pun">–</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span>
<span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
<span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vwidth </span><span class="pun">/</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> dwidth</span><span class="pun">;</span>
<span class="pln"> dy </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vheight </span><span class="pun">–</span><span class="pln"> dheight </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span>
<span class="pun">}</span>
<span class="kwd">if</span> <span class="pun">(</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun"><</span> <span class="lit">2</span> <span class="pun">*</span><span class="pln"> vwidth </span><span class="pun">)</span> <span class="pun">{</span>
<span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vwidth </span><span class="pun">/</span> <span class="pun">(</span> <span class="lit">2.0f</span> <span class="pun">*</span><span class="pln"> dwidth </span><span class="pun">);</span>
<span class="pln"> dx </span><span class="pun">=</span> <span class="pun">–</span><span class="pln"> dwidth </span><span class="pun">/</span> <span class="lit">2</span><span class="pun">;</span>
<span class="pln"> dy </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vheight </span><span class="pun">–</span><span class="pln"> dheight </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span>
<span class="pun">}</span>
<span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">();</span>
<span class="pln"> matrix</span><span class="pun">.</span><span class="pln">setScale </span><span class="pun">(</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> scale </span><span class="pun">);</span>
<span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postTranslate </span><span class="pun">(</span><span class="pln"> dx</span><span class="pun">,</span><span class="pln"> dy </span><span class="pun">);</span>
<span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span>
<span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageDrawable </span><span class="pun">(</span><span class="pln"> drawable </span><span class="pun">);</span>
<span class="pun">}</span>
<span class="com">// vwidth和vheight使用确定的值,因为如果在应用初始化时view.getWidth()可能为0</span>
**二、利用Matrix实现平移和放大**
平移和放大都是在当前图片的基础上,先用mImage.getImageMatrix()得到当前的matrix,再用Matrix的postTranslate或postScale方法就可以了。
需要注意的是:
如果用Matrix matrix = mImage.getImageMatrix (); //matrix只是得到一个对象的引用
应该用Matrix matrix = new Matrix ( mImage.getImageMatrix () );//这样才是得到一个克隆对象
**三、用ValueAnimator实现动画效果**
1、平移
dx为负是向左平移,为正是向右平移
因为图片的宽度设置为至少是view的2倍,所以向左和向右平移的最大距离都是vwidth / 2。
<span class="kwd">private</span> <span class="kwd">class</span> <span class="typ">MyTransXAnimatorListener</span> <span class="kwd">implements</span> <span class="typ">AnimatorUpdateListener</span> <span class="pun">{</span>
<span class="kwd">private</span> <span class="typ">Matrix</span><span class="pln"> mPrimaryMatrix</span><span class="pun">;</span>
<span class="kwd">public</span> <span class="typ">MyTransXAnimatorListener</span> <span class="pun">(</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">)</span> <span class="pun">{</span>
<span class="pln"> mPrimaryMatrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span>
<span class="pun">}</span>
<span class="lit">@Override</span>
<span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> onAnimationUpdate </span><span class="pun">(</span> <span class="typ">ValueAnimator</span><span class="pln"> animation </span><span class="pun">)</span> <span class="pun">{</span>
<span class="kwd">int</span><span class="pln"> dx </span><span class="pun">=</span> <span class="pun">(</span> <span class="typ">Integer</span> <span class="pun">)</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">getAnimatedValue </span><span class="pun">();</span>
<span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> mPrimaryMatrix </span><span class="pun">);</span>
<span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postTranslate </span><span class="pun">(</span><span class="pln"> dx</span><span class="pun">,</span> <span class="lit"></span> <span class="pun">);</span>
<span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span>
<span class="pun">}</span>
<span class="pun">}</span>
<span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setTranslateAnimation </span><span class="pun">()</span> <span class="pun">{</span>
<span class="typ">ValueAnimator</span><span class="pln"> animator </span><span class="pun">=</span> <span class="typ">ValueAnimator</span><span class="pun">.</span><span class="pln">ofInt </span><span class="pun">(</span> <span class="lit"></span><span class="pun">,</span> <span class="pun">–</span> <span class="lit">60</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">addUpdateListener </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">MyTransXAnimatorListener</span> <span class="pun">(</span><span class="pln"> mImage</span><span class="pun">.</span><span class="pln">getImageMatrix</span><span class="pun">()</span> <span class="pun">)</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">setDuration </span><span class="pun">(</span> <span class="lit">1000</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">setInterpolator </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">DecelerateInterpolator</span> <span class="pun">()</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">setStartDelay </span><span class="pun">(</span> <span class="lit">500</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">start </span><span class="pun">();</span>
<span class="pun">}</span>
2、放大
放大要设置中心点为ImageView的中心
<span class="kwd">private</span> <span class="kwd">class</span> <span class="typ">MyScaleAnimatorListener</span> <span class="kwd">implements</span> <span class="typ">AnimatorUpdateListener</span> <span class="pun">{</span>
<span class="kwd">private</span> <span class="typ">Matrix</span><span class="pln"> mPrimaryMatrix</span><span class="pun">;</span>
<span class="kwd">public</span> <span class="typ">MyScaleAnimatorListener</span> <span class="pun">(</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">)</span> <span class="pun">{</span>
<span class="pln"> mPrimaryMatrix </span><span class="pun">=</span><span class="pln"> matrix</span><span class="pun">;</span>
<span class="pun">}</span>
<span class="lit">@Override</span>
<span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> onAnimationUpdate </span><span class="pun">(</span> <span class="typ">ValueAnimator</span><span class="pln"> animation </span><span class="pun">)</span> <span class="pun">{</span>
<span class="kwd">float</span><span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="typ">Float</span> <span class="pun">)</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">getAnimatedValue </span><span class="pun">();</span>
<span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> mPrimaryMatrix </span><span class="pun">);</span>
<span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postScale </span><span class="pun">(</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> mWidth </span><span class="pun">/</span> <span class="lit">2</span><span class="pun">,</span><span class="pln"> mHeight </span><span class="pun">/</span> <span class="lit">2</span> <span class="pun">);</span>
<span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span>
<span class="pun">}</span>
<span class="pun">}</span>
<span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setScaleAnimation </span><span class="pun">()</span> <span class="pun">{</span>
<span class="typ">ValueAnimator</span><span class="pln"> animator </span><span class="pun">=</span> <span class="typ">ValueAnimator</span><span class="pun">.</span><span class="pln">ofFloat </span><span class="pun">(</span> <span class="lit">1.0f</span><span class="pun">,</span> <span class="lit">1.2f</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">addUpdateListener </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">MyScaleAnimatorListener</span> <span class="pun">(</span><span class="pln"> mImage</span><span class="pun">.</span><span class="pln">getImageMatrix </span><span class="pun">()</span> <span class="pun">)</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">setDuration </span><span class="pun">(</span> <span class="lit">1000</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">setInterpolator </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">DecelerateInterpolator</span> <span class="pun">()</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">setStartDelay </span><span class="pun">(</span> <span class="lit">500</span> <span class="pun">);</span>
<span class="pln"> animator</span><span class="pun">.</span><span class="pln">start </span><span class="pun">();</span>
<span class="pun">}</span>
转自:http://xie2010.blog.163.com/blog/static/2113173652014221240951/
💬 评论