Explanation and solution at the bottom.
(底部的说明和解决方案。)
I am developing one slider layout animation, the animation work fine but when all processes end, they get next Exception.
(我正在开发一个滑块布局动画,该动画可以正常工作,但是当所有进程结束时,它们将获得下一个异常。)
I guess RelativeLayout
parent have something to do in exception, but I don't know how to resolve it.
(我想RelativeLayout
父级有例外要做,但我不知道如何解决。)
09-06 11:24:58.952: E/Trace(30884): error opening trace file: No such file or directory (2)
09-06 11:25:09.113: E/AndroidRuntime(30884): FATAL EXCEPTION: main
09-06 11:25:09.113: E/AndroidRuntime(30884): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.widget.FrameLayout.onMeasure(FrameLayout.java:311)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.View.measure(View.java:15264)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.View.measure(View.java:15264)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.View.measure(View.java:15264)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
09-06 11:25:09.113: E/AndroidRuntime(30884): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2161)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.View.measure(View.java:15264)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2129)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1240)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1433)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1125)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4607)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:747)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.Choreographer.doCallbacks(Choreographer.java:567)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.Choreographer.doFrame(Choreographer.java:536)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:733)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.os.Handler.handleCallback(Handler.java:615)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.os.Handler.dispatchMessage(Handler.java:92)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.os.Looper.loop(Looper.java:153)
09-06 11:25:09.113: E/AndroidRuntime(30884): at android.app.ActivityThread.main(ActivityThread.java:5086)
09-06 11:25:09.113: E/AndroidRuntime(30884): at java.lang.reflect.Method.invokeNative(Native Method)
09-06 11:25:09.113: E/AndroidRuntime(30884): at java.lang.reflect.Method.invoke(Method.java:511)
09-06 11:25:09.113: E/AndroidRuntime(30884): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
09-06 11:25:09.113: E/AndroidRuntime(30884): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
09-06 11:25:09.113: E/AndroidRuntime(30884): at dalvik.system.NativeStart.main(Native Method)
activity_home.xml
(activity_home.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/leftView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cad000"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
android:id="@+id/mainView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#876000"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#cecece"
android:orientation="horizontal" >
<Button
android:id="@+id/btnSlide"
style="@style/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="X" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
Activity
(活动)
public class HomeActivity extends Activity implements OnClickListener {
UserStorage userStorage = new UserStorage();
private Button btnSlide;
private LinearLayout mainView, leftView;
private SliderAnimation slideAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
this.leftView = (LinearLayout) findViewById(R.id.leftView);
this.mainView = (LinearLayout) findViewById(R.id.mainView);
this.btnSlide = (Button) findViewById(R.id.btnSlide);
this.btnSlide.setOnClickListener(this);
this.slideAnimation = new SliderAnimation(this);
this.slideAnimation.initializeFilterAnimations(this.mainView, this.leftView);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnSlide:
this.slideAnimation.toggleLeftSliding();
break;
}
}
}
AnimationListener
(动画监听器)
public class SliderAnimation implements AnimationListener {
private Context context;
private LinearLayout mainView, leftView;
private Animation mainSlideIn, mainSlideOut;
private boolean leftAnimated, rightAnimated = false;
private int deviceWidth;
public SliderAnimation(Context context) {
this.context = context;
DisplayMetrics displayMetrics = context.getResources()
.getDisplayMetrics();
this.deviceWidth = displayMetrics.widthPixels;
}
public void initializeFilterAnimations(LinearLayout mainView,
LinearLayout leftView) {
this.mainView = mainView;
this.leftView = leftView;
this.mainSlideIn = AnimationUtils.loadAnimation(context,
R.anim.main_slide_in);
this.mainSlideIn.setAnimationListener(this);
this.mainSlideOut = AnimationUtils.loadAnimation(context,
R.anim.main_slide_out);
this.mainSlideOut.setAnimationListener(this);
}
public void toggleLeftSliding() {
if (!this.leftAnimated) {
this.mainView.startAnimation(this.mainSlideIn);
} else {
this.mainView.startAnimation(this.mainSlideOut);
}
}
@Override
public void onAnimationEnd(Animation animation) {
if (!this.leftAnimated) {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
(this.deviceWidth * 20) / 100, this.mainView.getHeight());
params.leftMargin = (this.deviceWidth * 80) / 100;
this.mainView.setLayoutParams(params);
this.leftAnimated = true;
} else {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
this.deviceWidth, this.mainView.getHeight());
params.leftMargin = 0;
this.mainView.setLayoutParams(params);
this.leftAnimated = false;
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationStart(Animation animation) {
}
}
Thank you in advance.
(先感谢您。)
EXPLANATION AND SOLUTION
(解释和解决方案)
We've to know the parent ViewGroup container for the view, because views are filled with their parent LayoutParams for measure purposes.
(我们必须知道该视图的父ViewGroup容器,因为视图是用其父LayoutParams填充的,以进行度量。)
If we don't know through a simple glance on the xml which is the parent ViewGroup for the View, we can get always its reference with .getParent() method from the View instance.
(如果我们不了解xml(即View的父ViewGroup),则可以始终从View实例中使用.getParent()方法获取其引用。)
ask by Dani translate from so