新入职的公司的用户主要是发展中国家用户,用户的手机配置普遍较低。入职第二周的任务是适配android2.3以上的机型,下面将在适配过程中遇到的问题进行整理。
- 关于用到的第三方的sdk版本高于我需要兼容的版本,这个我额外的记录了一篇文章。
- 关于项目中的属性动画,属性动画是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));
关于屏幕适配,今天处理了一个SAMSUNG GF-s5360,屏幕是240*320,处理这个视频,我新增了一个layout-ldpi文件夹,然后做出对应的界面优化。在这里推荐一个开发助手软件,这个对开发很有帮助。
优化了android 自定义控件的适配问题,这个处理的方式是依赖提供的各种文件夹来完成的。