美文网首页
android属性动画低版本适配

android属性动画低版本适配

作者: 杨hai | 来源:发表于2017-08-07 20:14 被阅读357次

    新入职的公司的用户主要是发展中国家用户,用户的手机配置普遍较低。入职第二周的任务是适配android2.3以上的机型,下面将在适配过程中遇到的问题进行整理。

    1. 关于用到的第三方的sdk版本高于我需要兼容的版本,这个我额外的记录了一篇文章
    2. 关于项目中的属性动画,属性动画是android 11的时候出来的,我使用的是NineOldAnroids, 使用这个库的时候,发现位移动画做不了,代码如下:
       ObjectAnimator animSpeedX = ObjectAnimator.ofFloat(v, "X", targetX, onlineDeviceX);
       ObjectAnimator animSpeedY = ObjectAnimator.ofFloat(v, "Y", targetY, onlineDeviceY);
    

    查看NineOldAndroids的代码后,

    static {
           PROXY_PROPERTIES.put("alpha", PreHoneycombCompat.ALPHA);
           PROXY_PROPERTIES.put("pivotX", PreHoneycombCompat.PIVOT_X);
           PROXY_PROPERTIES.put("pivotY", PreHoneycombCompat.PIVOT_Y);
           PROXY_PROPERTIES.put("translationX", PreHoneycombCompat.TRANSLATION_X);
           PROXY_PROPERTIES.put("translationY", PreHoneycombCompat.TRANSLATION_Y);
           PROXY_PROPERTIES.put("rotation", PreHoneycombCompat.ROTATION);
           PROXY_PROPERTIES.put("rotationX", PreHoneycombCompat.ROTATION_X);
           PROXY_PROPERTIES.put("rotationY", PreHoneycombCompat.ROTATION_Y);
           PROXY_PROPERTIES.put("scaleX", PreHoneycombCompat.SCALE_X);
           PROXY_PROPERTIES.put("scaleY", PreHoneycombCompat.SCALE_Y);
           PROXY_PROPERTIES.put("scrollX", PreHoneycombCompat.SCROLL_X);
           PROXY_PROPERTIES.put("scrollY", PreHoneycombCompat.SCROLL_Y);
           PROXY_PROPERTIES.put("x", PreHoneycombCompat.X);
           PROXY_PROPERTIES.put("y", PreHoneycombCompat.Y);
       }
    

    将X,Y改成了小写,问题就处理了。通过查看android11以上的自带的源码,

      static String getMethodName(String prefix, String propertyName) {
            if (propertyName == null || propertyName.length() == 0) {
                // shouldn't get here
                return prefix;
            }
            char firstLetter = Character.toUpperCase(propertyName.charAt(0));
            String theRest = propertyName.substring(1);
            return prefix + firstLetter + theRest;
        }
    

    是将属性的第一个字母转换成了大写,而在NineOldAndroids中的实现是如下:

     static Property<View, Float> Y = new FloatProperty<View>("y") {
            @Override
            public void setValue(View object, float value) {
                AnimatorProxy.wrap(object).setY(value);
            }
    
            @Override
            public Float get(View object) {
                return AnimatorProxy.wrap(object).getY();
            }
        };
    
    /** Whether or not the current running platform needs to be proxied. */
        public static final boolean NEEDS_PROXY = Integer.valueOf(Build.VERSION.SDK).intValue() < Build.VERSION_CODES.HONEYCOMB;
    
     /**
         * Create a proxy to allow for modifying post-3.0 view properties on all
         * pre-3.0 platforms. <strong>DO NOT</strong> wrap your views if you are
         * using {@code ObjectAnimator} as it will handle that itself.
         *
         * @param view View to wrap.
         * @return Proxy to post-3.0 properties.
         */
        public static AnimatorProxy wrap(View view) {
            AnimatorProxy proxy = PROXIES.get(view);
            // This checks if the proxy already exists and whether it still is the animation of the given view
            if (proxy == null || proxy != view.getAnimation()) {
                proxy = new AnimatorProxy(view);
                PROXIES.put(view, proxy);
            }
            return proxy;
        }
    
     public void setY(float y) {
            View view = mView.get();
            if (view != null) {
                setTranslationY(y - view.getTop());
            }
        }
    

    通过上面的代码,可以知道,当sdk的版本小于11的时候,写成了大写的X,Y,就找不到对应的代理。在android11以下的源码中,没有,setX,setY之类的方法,NineOldAndroids 虚拟了这些方法出来,做了自己的实现。
    除了上面的属性动画外,因为android2.3没有提供setX,setY,setAlpha一类的方法,我也是使用NineOldAndroids 中提供的方案兼容android2.3 的。例如:

    ObjectAnimator.ofFloat(safeIcon,"alpha",1).start();
    ViewHelper.setTranslationY(giftTagView,-DensityUtils.dp2px(getActivity(), 2));
    
    1. 关于屏幕适配,今天处理了一个SAMSUNG GF-s5360,屏幕是240*320,处理这个视频,我新增了一个layout-ldpi文件夹,然后做出对应的界面优化。在这里推荐一个开发助手软件,这个对开发很有帮助。

    2. 优化了android 自定义控件的适配问题,这个处理的方式是依赖提供的各种文件夹来完成的。

    相关文章

      网友评论

          本文标题:android属性动画低版本适配

          本文链接:https://www.haomeiwen.com/subject/ilnalxtx.html