我正在尝试创建一个简单的库,我想在其中定义类似于Glide的类。因此我可以使用MyAnimation.with(context)
来调用它,但无论我将其定义为abstract
,final
还是Singleton,我都无法做到。我必须创建一个实例来访问其公共方法with(Context context)
,其编写如下:
/**
* initializes context for the current instance
* @param context context to be used for {@link ConstraintSet}
* @return an instance of {@link MyAnimation}
*/
public MyAnimation with(Context context) {
mContext = context;
mConstraintSet = new ConstraintSet();
return this;
}
如您所见,with()
返回该类的实例,然后我有另一个公共方法from(@LayouRes int res)
,它采用布局并再次返回this
。
/**
*
* @param secondKeyframe This is the layout from which constraints will be picked
* @return An instance of this class
* @throws IllegalStateException Throws exception if context has not been initialized
*/
public MyAnimation from(@LayoutRes int secondKeyframe, Transition customTransition) throws IllegalStateException {
if(mContext == null) {
throw new IllegalStateException("Context not initalized. Please call with(Context) first");
}
mTransition = customTransition;
mConstraintSet.clone(mContext, secondKeyframe);
return this;
}
最后,有一个方法animate(ViewGroup view)
可以在ViewGroup
上执行简单动画。有什么想法我能做到吗?
/**
* Applies animation after applying new {@link ConstraintSet}
* @param view The ViewGroup on which the animation will be performed
*/
public void animate(ViewGroup view) {
mConstraintSet.applyTo((ConstraintLayout) view);
mLayout = (ConstraintLayout) view;
if(mTransition != null) {
TransitionManager.beginDelayedTransition(mLayout, mTransition);
}
else {
TransitionManager.beginDelayedTransition(mLayout);
}
}
拜托,我真的想把我的图书馆叫做Glide(:D)
答案 0 :(得分:3)
您需要制作这些方法set
。静态方法不需要调用类的实例。他们只是类成员,而不是实例成员。
答案 1 :(得分:1)
正如@PrzemysławMoskal所说,
Class.method()
之类的方法,那么method
应为static
。this
,因为你可以从调用方法的地方MyAnimation.xxx
或from()
访问with()
。 non-static
方法访问static
个变量;所以,请mContext, mConstraintSet, mTransition
等static
。如果您再收到任何错误,请告诉我。
答案 2 :(得分:1)
您需要将方法设为静态:
public class MyGlide{
public static MyAnimation with(Context context) {
//do something
};
}
所以当你在另一个活动/班级中调用它时
MyGlide.with(CurrentContext);
答案 3 :(得分:1)
因为,MyAnimation
是由您和您编写
MyAnimation.with(context)
这意味着with()
应该被定义为static
方法,它告诉它具有类级别关联而不是实例。
您还需要了解,使用this
关键字实际上是指此类的当前实例。现在,这将与上述陈述相矛盾。您无法同时将方法声明为static
和return this
。
当您在问题中提及Singleton
时,我假设您正在尝试return
MyAnimation
的实例。因此,如果您在每次调用时都需要新实例,那么只需更改
return this;
到
return new MyAnimation();