本文实例为大家分享了Android轨迹动画的具体代码,供大家参考,具体内容如下
<强>二,需求描述强>
年中那会儿基友的公司给他了一张只有一条曲线的图,想让他按照曲线的轨迹动态展示整个曲线,然而基友忙于把妹,一个馒头的代价收买了我,于是帮他写了代码。先看下实现效果,,,,,,,,,,,
上原始图(原始图的轨迹曲线是白色的,其他部分是透明的,这里为了便于观察,我将背景调为黑色)
<强>三,分析实现强>
,,,,讲道理,刚拿到这个图片的时候我也有点懵逼,一个毫无规律的曲线很显然不能通过简单的方程式去描述点的具体位置,甚至想说设计直接给个动画岂不美滋滋……,
,,,,吐槽归吐槽,需求还是要实现的,而且这个需求是有不少常见的方法可以进行实现的,比如上下两层图片保持一直,上层不断从左到右将原图纵向像素清除,然后将设计给的图片也按照从左到友的顺去绘制上去。不过这种方法的可扩展性太差,底层的图片发生改变(滑动,变色)上层也需要进行配合。
,,,,这里使用方法是:将图片中有色像素在图片上的位置按照比例映射到要绘制的视图中。
,,,,比如,原图大小是200 * 100,要去做展示的视图的尺寸大小是450 * 300,某点在原图中位于x100,日元的位置,那么它在视图中的位置应该为225,60。也就是说将该点在途中的位置比上原图对应尺寸然后在乘以视图的尺寸即可。
,,,,轨迹的获取可以通过获取全部的像素点颜色,因为透明的必然不是轨迹,所以判断α值即可,又因为轨迹是一条线,当我们使用路径连点的时候为了尽量减少不必要点的连接,我这里通过平均值的方式将曲线的宽度降为1 .
,,,,由于点的位置是按照尺寸比例计算的,所以无论要展示的图片尺寸有多奇葩,都可以完美适配上去,,,,,,,,
<强>四,实现代码强>
公共类TestView扩展视图实现ViewTreeObserver.OnGlobalLayoutListener { 私人涂漆=new (); 私人位图的位图; 私人int[]当地; 布尔输入=false; int数; ViewTreeObserver观察者; 帆布画布; 浮动lastX=0; 浮动lastY=0; 公共TestView(上下文语境){ 超级(上下文); } 公共TestView(上下文语境、AttributeSet attrs int defStyleAttr) { 超级(上下文、attrs defStyleAttr); 观察者=this.getViewTreeObserver (); observer.addOnGlobalLayoutListener(这个); getImageFromAssetsFile (target.png ");//读取图片 } 公共TestView(上下文语境,AttributeSet attrs) { 超级(上下文,attrs); 观察者=this.getViewTreeObserver (); observer.addOnGlobalLayoutListener(这个); getImageFromAssetsFile (“target.png”); } 私人空间getImageFromAssetsFile(字符串文件名){ .getAssets AssetManager我=getresource () (); 尝试{ InputStream是=am.open(文件名); 位图=BitmapFactory.decodeStream(是); is.close (); } 抓住(IOException e) { e.printStackTrace (); } } 私人空间filterColor () { int w=bitmap.getWidth (); int h=bitmap.getHeight (); int[]像素=new int [w * h]; 当地=new int [w];//以原图宽为单位,保存点在原图Y轴上的位置 bitmap.getPixels(像素,0,bitmap.getWidth (), 0, 0, bitmap.getWidth (), bitmap.getHeight ()); for (int i=0;我& lt;w;我+ +){ int长度=0; int总=0; (int j=0; j一个简单的Android轨迹动画