对于方法的执行次数,可以再使用类的成员变量。
只调用一次,可以使用一个Boolean型变量,如:
if (mDragWordCount >= 2) {
Log.d("drag", "mDragWordCount >= 2");
if (!onlyOnce) {
nextWord();
onlyOnce = true;
}
} else {
Log.d("drag", "mDragWordCount <2");
nextWord();
}
}
本案例主要是解决移动多个字母时出现的,多次调用方法setContent(),以致出现致命的错误。比如一个fragment中有五个单词,那么,如果对当前的单词移动的字母至少两个,那么方法setContent()至少调用两次,也就是说,显示下一个单词的是至少是第三个了,第二个根本就没有显示。由于之前设置的是一个针对于Fragment的成员变量,只有一个,而没有针对每个单词进行设置成员变量,也就是,当我,每次调用方法setContent()时,我进行设置,如代码:
private void setContent(int index) {
mDraListener = new DragAnimationListener();
Log.d(TAG, pageCount + "===pageCount==index=" + index);
if (pageCount < 5) {
mRandomChars = ConfigWordData.vocabulary.ALPHABETS[index][pageCount];
Log.d(TAG, mRandomChars + "---------------");
mSpliceWord = ConfigWordData.vocabulary.SPLICE_VOCABULARYS[index][pageCount];
mRightWord = ConfigWordData.vocabulary.RIGHT_VOCABULARYS[index][pageCount];
imageId = ConfigWordData.picture.WORD_PICTURES[index][pageCount];
mWordPic.setBackgroundResource(imageId);
pageCount++;
}
}
这样就可以,解决掉每个单词对应着一个动画监听器,而不是。五个单词对应着一个监听器。因此,也就解决了之前的困扰。
本案例主要是针对一个单词中字母的移动的情况,对匹配不同的字母进行自动移动匹配,寻找正确地位置,自己站到那里去。
一个字母匹配有误的话,动画也就只执行一次,当有两个以上时,会调用多次。
动画监听:
public class DragAnimationListener implements AnimationListener {
/**
* The method nextWord only do one time every word .
*/
private boolean onlyOnce = false;
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
if (mDragWordCount >= 2) {
Log.d("drag", "mDragWordCount >= 2");
if (!onlyOnce) {
nextWord();
onlyOnce = true;
}
} else {
Log.d("drag", "mDragWordCount <2");
nextWord();
}
}
}
动画设置代码:
for (int l = 0; l < mAlphabetList.size(); l++) {
if (mAlphaList.get(l).getText().toString()
.equals(indexContent)
&& !mSpliceRWList
.get(k)
.getAlphabet()
.equals(mSpliceWList.get(k)
.getAlphabet())) {
Alphabet alphaF = mAlphabetList.get(l);
Alphabet alphaT = mSpliceRWList.get(k);
float fromX = (float) alphaF.getX();
float fromY = (float) alphaF.getY();
float toX = (float) alphaT.getX();
float toY = (float) alphaT.getY();
float dx = toX - fromX;
float dy = toY - fromY;
TextView tvDrag = mAlphaList.get(l);
//
// // 拖动的动画的执行次数计算
//
// mDragWordCount++;
Animation dragAnim = new TranslateAnimation(0,
dx, 0, dy);
dragAnim.setDuration(1000);// 设置动画所用的时间
dragAnim.setFillAfter(true);
dragAnim.setAnimationListener(mDraListener);
tvDrag.startAnimation(dragAnim);
// 可能需要需要设置mAlphabetList中的各个坐标
}
}
在动画设置代码中设置了监听器:(mDraListener);
之前是将(mDraListener);这个初始化为这个类(外部类Fragment)的成员变量,导致,很多个单词都共享这个监听器。由于,还有下一个单词,所以在设置下一个单词的方法中nextWord()中调用setContent方法,而在方法setContent中mDraListener = new DragAnimationListener();那么,每一个单词都对应一个监听器,也就是,在动画结束时方法nextWord只会调用一次(一个单词调用一次方法nextWord),按照顺序执行下一个单词。