Android 属性动画扩展

原创
2018/03/20 23:23
阅读数 156

属性动画扩展

属性动画不是所有的属性都支持,为了让属性动画支持此属性,我们需要通过在封装的方式,以代理手动驱动动画。

扩展属性动画的width

public class WrapperView{
    
    private View targetView;

   public static WrapperView bind(View targetView){
     return new WrapperView(targetView);

  }
    private WrapperView(View targetView){
      this.targetView = targetView;
   }
   
  public void setWidth(int width){
 
     targetView.getLayoutParams().width = width;
      targetView.requestLayout();
  }
  
   public int getWidth(){

     return (int)Math.max(targetView.getLayoutParams().width,targetView.getMeasureWidth());

  }
}

使用

ObjectAnimator.ofInt(WrapperView.bind(userImageView),"width",300).setDuration(3000).start();

 

属性动画反射问题

属性动画内部实现是通过反射调用的,因此,如果我们要混淆代码,建议对setter方法做保留

1.首先,定义一个标记

public interface IWrapperAnimator {
}

2.让扩展类继承此接口

public class WrapperView  implements IWrapperAnimator {
    
    private View targetView;

   public static WrapperView bind(View targetView){
     return new WrapperView(targetView);

  }

private WrapperView(View targetView){
      this.targetView = targetView;
}
 
public void setWidth(int width){

     targetView.getLayoutParams().width = width;
     targetView.requestLayout();
 }
public int getWidth(){
   
     return (int)Math.max(targetView.getLayoutParams().width,targetView.getMeasureWidth());
  }
}

3.避免混淆

-keepclassmembers public class * implements com.m8.qq.ui.IWrapperAnimator{
    *** set*(***);
    *** get*();
}

 

 

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部