* [android] Move perspective from style to transform
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/cc49764e Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/cc49764e Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/cc49764e Branch: refs/heads/0.16-dev Commit: cc49764e6de39774804904f163b5d51fdfc520ef Parents: 924d252 Author: YorkShen <shenyua...@gmail.com> Authored: Thu Jul 27 11:30:26 2017 +0800 Committer: YorkShen <shenyua...@gmail.com> Committed: Thu Jul 27 11:30:26 2017 +0800 ---------------------------------------------------------------------- .../taobao/weex/dom/action/AnimationAction.java | 1 + .../ui/animation/CameraDistanceProperty.java | 54 ++++++++++++++++++++ .../weex/ui/animation/WXAnimationBean.java | 26 ++++++++++ .../taobao/weex/ui/component/WXComponent.java | 22 -------- 4 files changed, 81 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/cc49764e/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java index 59afbca..5510ea9 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java @@ -155,6 +155,7 @@ class AnimationAction implements DOMAction, RenderAction { if (interpolator != null) { animator.setInterpolator(interpolator); } + component.getHostView().setCameraDistance(mAnimationBean.styles.getCameraDistance()); animator.setDuration(mAnimationBean.duration); animator.start(); } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/cc49764e/android/sdk/src/main/java/com/taobao/weex/ui/animation/CameraDistanceProperty.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/animation/CameraDistanceProperty.java b/android/sdk/src/main/java/com/taobao/weex/ui/animation/CameraDistanceProperty.java new file mode 100644 index 0000000..67b9235 --- /dev/null +++ b/android/sdk/src/main/java/com/taobao/weex/ui/animation/CameraDistanceProperty.java @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.taobao.weex.ui.animation; + +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.util.Property; +import android.view.View; + + +class CameraDistanceProperty extends Property<View, Float> { + + private final static String TAG = "CameraDistance"; + private static CameraDistanceProperty instance; + + static Property<View, Float> getInstance(){ + return instance; + } + + private CameraDistanceProperty() { + super(Float.class, TAG); + } + + @Override + public Float get(View view) { + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { + return view.getCameraDistance(); + } + else{ + return Float.NaN; + } + } + + @Override + public void set(View object, Float value) { + object.setCameraDistance(value); + } +} http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/cc49764e/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java b/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java index 54b3111..d83b85a 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java @@ -26,7 +26,9 @@ import android.text.TextUtils; import android.util.Pair; import android.util.Property; import android.view.View; +import com.taobao.weex.WXEnvironment; import com.taobao.weex.common.Constants; +import com.taobao.weex.common.Constants.Name; import com.taobao.weex.utils.FunctionParser; import com.taobao.weex.utils.WXDataStructureUtil; import com.taobao.weex.utils.WXUtils; @@ -91,6 +93,7 @@ public class WXAnimationBean { wxToAndroidMap.put(WX_SCALE, Arrays.asList(View.SCALE_X, View.SCALE_Y)); wxToAndroidMap.put(WX_SCALE_X, Collections.singletonList(View.SCALE_X)); wxToAndroidMap.put(WX_SCALE_Y, Collections.singletonList(View.SCALE_Y)); + wxToAndroidMap.put(Name.PERSPECTIVE, Collections.singletonList(CameraDistanceProperty.getInstance())); wxToAndroidMap = Collections.unmodifiableMap(wxToAndroidMap); } @@ -103,6 +106,7 @@ public class WXAnimationBean { private Map<Property<View, Float>, Float> transformMap = new HashMap<>(); private Pair<Float, Float> pivot; private List<PropertyValuesHolder> holders=new LinkedList<>(); + private float cameraDistance = Float.MAX_VALUE; private static Map<Property<View,Float>, Float> parseTransForm(@Nullable String rawTransform, final int width, final int height,final int viewportW) { @@ -135,6 +139,9 @@ public class WXAnimationBean { propertyList.contains(View.SCALE_Y)) { convertedList.addAll(parseScale(propertyList.size(), rawValue)); } + else if(propertyList.contains(CameraDistanceProperty.getInstance())){ + convertedList.add(parseCameraDistance(rawValue)); + } if (propertyList.size() == convertedList.size()) { for (int i = 0; i < propertyList.size(); i++) { result.put(propertyList.get(i), convertedList.get(i)); @@ -209,6 +216,18 @@ public class WXAnimationBean { convertedList.add(parsePercentOrPx(first, width,viewportW)); convertedList.add(parsePercentOrPx(second, height,viewportW)); } + + private Float parseCameraDistance(List<String> rawValue){ + float ret=Float.MAX_VALUE; + if(rawValue.size() == 1){ + float value = WXViewUtils.getRealPxByWidth(WXUtils.getFloat(rawValue.get(0)), viewportW); + float scale = WXEnvironment.getApplication().getResources().getDisplayMetrics().density; + if (!Float.isNaN(value) && value > 0) { + ret = value * scale; + } + } + return ret; + } }); return parser.parse(); } @@ -300,6 +319,9 @@ public class WXAnimationBean { pivot = parsePivot(transformOrigin,width,height,viewportW); transformMap = createDefaultTransform(); transformMap.putAll(parseTransForm(rawTransform,width,height,viewportW)); + if(transformMap.containsKey(CameraDistanceProperty.getInstance())){ + cameraDistance = transformMap.remove(CameraDistanceProperty.getInstance()); + } initHolders(); } @@ -315,5 +337,9 @@ public class WXAnimationBean { public List<PropertyValuesHolder> getHolders(){ return holders; } + + public float getCameraDistance(){ + return cameraDistance; + } } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/cc49764e/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java index 80cd4db..3d769d4 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java @@ -48,7 +48,6 @@ import com.taobao.weex.WXSDKInstance; import com.taobao.weex.WXSDKManager; import com.taobao.weex.bridge.Invoker; import com.taobao.weex.common.Constants; -import com.taobao.weex.common.Constants.Name; import com.taobao.weex.common.IWXObject; import com.taobao.weex.common.WXRuntimeException; import com.taobao.weex.dom.ImmutableDomObject; @@ -676,8 +675,6 @@ public abstract class WXComponent<T extends View> implements IWXObject, IWXActi updateElevation(); } return true; - case Name.PERSPECTIVE: - return setPerspective(param); case PROP_FIXED_SIZE: String fixedSize = WXUtils.getString(param, PROP_FS_MATCH_PARENT); setFixedSize(fixedSize); @@ -722,22 +719,6 @@ public abstract class WXComponent<T extends View> implements IWXObject, IWXActi } } - private boolean setPerspective(Object param) { - T host = getHostView(); - boolean ret = false; - if (host != null) { - float value = WXViewUtils.getRealPxByWidth(WXUtils.getFloat(param), getInstance().getInstanceViewPortWidth()); - float scale = host.getResources().getDisplayMetrics().density; - if (!Float.isNaN(value) && value > 0) { - host.setCameraDistance(value * scale); - ret = true; - } else { - host.setCameraDistance(Float.MAX_VALUE); - } - } - return ret; - } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN) protected void setAriaHidden(boolean isHidden) { View host = getHostView(); @@ -963,9 +944,6 @@ public abstract class WXComponent<T extends View> implements IWXObject, IWXActi */ @CallSuper protected void onHostViewInitialized(T host){ - if(host!=null){ - host.setCameraDistance(Float.MAX_VALUE); - } if (mAnimationHolder != null) { //Performs cached animation mAnimationHolder.execute(mInstance, this);