图片滑动渐变

移动开发
Android图片滑动渐变,实现动画特效。

源码简介:Android图片滑动渐变,实现动画特效。

源码效果:

源码片段:

  1. package com.example.tz_demo_8_14; 
  2.   
  3. import android.graphics.Canvas; 
  4. import android.graphics.ColorFilter; 
  5. import android.graphics.Rect; 
  6. import android.graphics.drawable.Drawable; 
  7. import android.util.Log; 
  8. import android.view.Gravity; 
  9.   
  10. public class RevealDrawable extends Drawable { 
  11.   
  12.     private Drawable mUnSelectedDrawable; 
  13.     private Drawable mSelectedDrawable; 
  14.     private Rect outRect = new Rect(); 
  15.   
  16.     public RevealDrawable(Drawable unSelectedDrawable, Drawable selectedDrawable) { 
  17.         this.mUnSelectedDrawable = unSelectedDrawable; 
  18.         this.mSelectedDrawable = selectedDrawable; 
  19.     } 
  20.   
  21.     /** 
  22.      * level:0~10000 全彩色:5000 全灰色:0||10000 渐变色:5000~10000 
  23.      */ 
  24.     @Override 
  25.     public void draw(Canvas canvas) { 
  26.           
  27.         int level = getLevel(); 
  28.         if (level == 0 || level == 10000) { 
  29.             // 全灰色 
  30.             mUnSelectedDrawable.draw(canvas); 
  31.         } else if (level == 5000) { 
  32.             // 全彩色 
  33.             mSelectedDrawable.draw(canvas); 
  34.         } else { 
  35.             // 渐变色(一部分灰色,一部分彩色): 
  36.             // 得到当前Drawable的矩形边界 
  37.             Rect bounds = getBounds(); 
  38.             Rect r = outRect; 
  39.               
  40.             {// 1.从灰色的图片抠出左边的部分矩形 
  41.                 // level:0~5000~10000 
  42.                 float ratio = (level / 5000f) - 1f; 
  43.                 int w = bounds.width(); 
  44.                 w = (int) (w * Math.abs(ratio)); 
  45.                 int h = bounds.height(); 
  46.                 int gravity = ratio < 0 ? Gravity.LEFT : Gravity.RIGHT; 
  47.   
  48.                 Gravity.apply(gravity, // 从左边开始切还是从右边 
  49.                         w, // 目标矩形的宽 
  50.                         h, // 目标矩形的高 
  51.                         bounds, // 被抠出来的原矩形 
  52.                         r);// 目标矩形 -- 最终画布里面需要的矩形区域 
  53.   
  54.                 // 保存画布的原型 
  55.                 canvas.save(); 
  56.                 // 将画布裁剪一部分出来 
  57.                 canvas.clipRect(r); 
  58.                 mUnSelectedDrawable.draw(canvas); 
  59.                 // 恢复画布 
  60.                 canvas.restore(); 
  61.             } 
  62.             {// 2. 从彩色的图片抠出右边的部分矩形 
  63.                 // level:0~5000~10000 
  64.                 float ratio = (level / 5000f) - 1f; 
  65.                 int w = bounds.width(); 
  66.                 w -= (int) (w * Math.abs(ratio)); 
  67.                 int h = bounds.height(); 
  68.                 int gravity = ratio < 0 ? Gravity.RIGHT : Gravity.LEFT; 
  69.   
  70.                 Gravity.apply(gravity, // 从左边开始切还是从右边 
  71.                         w, // 目标矩形的宽 
  72.                         h, // 目标矩形的高 
  73.                         bounds, // 被抠出来的原矩形 
  74.                         r);// 目标矩形 -- 最终画布里面需要的矩形区域 
  75.   
  76.                 // 保存画布的原型 
  77.                 canvas.save(); 
  78.                 // 将画布裁剪一部分出来 
  79.                 canvas.clipRect(r); 
  80.                 mSelectedDrawable.draw(canvas); 
  81.                 // 恢复画布 
  82.                 canvas.restore(); 
  83.             } 
  84.         } 
  85.     } 
  86.       
  87.     @Override 
  88.     protected boolean onLevelChange(int level) { 
  89.         // 感知setLevel的调用,然后刷新 -- draw() 
  90.         invalidateSelf(); 
  91.         return true
  92.     } 
  93.   
  94.     /** 
  95.      * 初始化数据 
  96.      */ 
  97.     @Override 
  98.     protected void onBoundsChange(Rect bounds) { 
  99.         // 定义两个Drawable图片的宽高 -- bound边界 
  100.         mUnSelectedDrawable.setBounds(bounds); 
  101.         mSelectedDrawable.setBounds(bounds); 
  102.         super.onBoundsChange(bounds); 
  103.     } 
  104.   
  105.     /** 
  106.      * 得到Drawable的实际宽高 
  107.      */ 
  108.     @Override 
  109.     public int getIntrinsicWidth() { 
  110.         return mSelectedDrawable.getIntrinsicWidth(); 
  111.     } 
  112.   
  113.     @Override 
  114.     public int getIntrinsicHeight() { 
  115.         return mSelectedDrawable.getIntrinsicHeight(); 
  116.     } 
  117.   
  118.     @Override 
  119.     public void setAlpha(int alpha) { 
  120.   
  121.     } 
  122.   
  123.     @Override 
  124.     public void setColorFilter(ColorFilter cf) { 
  125.   
  126.     } 
  127.   
  128.     @Override 
  129.     public int getOpacity() { 
  130.         return 0
  131.     } 
  132.   

下载地址:http://down.51cto.com/data/2096556

责任编辑:倪明 来源: devstore
相关推荐

2012-04-06 13:52:58

ASP.NET

2011-04-22 11:24:13

mootools

2023-06-07 10:41:43

2013-10-16 16:17:15

iOS开发优化方案

2023-05-08 09:08:33

CSS前端

2015-10-20 15:54:16

android源码滑动关闭

2014-07-22 10:58:33

HTML5jQuery

2014-12-31 14:52:27

SwipeMenuLiSwipeMenu

2015-07-17 10:51:01

滑动菜单

2023-06-05 09:28:32

CSS渐变

2021-09-01 08:32:13

CSS 技巧@property

2011-07-18 13:06:18

渐变维度数据库

2015-09-22 10:53:27

引导页

2013-06-20 10:50:51

Objective-CiOS左右滑动手势

2017-05-03 16:30:38

AndroidScrollView滚动视图

2022-10-27 09:13:58

CSSGradient

2023-02-24 08:32:50

CSS渐变属性

2013-06-20 11:10:24

iOS开发UItableView单元格背景渐变

2022-05-27 14:55:34

canvas画布鸿蒙

2015-02-28 15:55:32

手势gesture过渡
点赞
收藏

51CTO技术栈公众号