我的布局背景有一张图片。我希望它开始向右移动,从右边消失的每一帧都应该重新出现在左边。因此,图像将仅与照片的一帧连续移动。我怎么能这样做?
答案 0 :(得分:1)
这是最简单,最快捷的方式,它可以在ImageView
中拥有两个ViewGroup
,并使用两个不同的动画为它们设置动画效果。通过获取容器的宽度,第一个将从其位置(START
)移动到右边缘(PARENT_WIDTH
),第二个将从容器外部跟随({{1} })到里面(-PARENT_WIDTH
)。最后,让动画重复START
会产生真实循环的错觉。
INFINITE
容器ViewGroup的宽度为private ViewGroup parent;
private ImageView imgInner, imgOutter;
@Override
public void onCreate(...) {
...
parent = (ViewGroup) findViewById(R.id.parent_loop);
imgInner = (ImageView) findViewById(R.id.image_loop_inner);
imgOutter = (ImageView) findViewById(R.id.image_loop_outter);
...
setImageLoop();
}
private void setImageLoop() {
// Need a thread to get the real size or the parent
// container, after the UI is displayed
imgInner.post(new Runnable() {
@Override
public void run() {
TranslateAnimation outAnim =
new TranslateAnimation(
0f, parent.getWidth(), 0f, 0f);
// move from 0 (START) to width (PARENT_SIZE)
outAnim.setInterpolator(new LinearInterpolator());
outAnim.setRepeatMode(Animation.INFINITE); // repeat the animation
outAnim.setRepeatCount(Animation.INFINITE);
outAnim.setDuration(2000);
TranslateAnimation inAnim =
new TranslateAnimation(
- parent.getWidth(), 0f, 0f, 0f);
// move from out width (-PARENT_SIZE) to 0 (START)
inAnim.setInterpolator(new LinearInterpolator());
inAnim.setRepeatMode(Animation.INFINITE);
inAnim.setRepeatCount(Animation.INFINITE);
inAnim.setDuration(2000); // same duration as the first
imgInner.startAnimation(outAnim); // start first anim
imgOutter.startAnimation(inAnim); // start second anim
}
});
}
,但可以更改,因此match_parent
属性将替换为START
之类的内容。此布局可以是parent.getLeft()
,LinearLayout
或其他任何内容。例如,我使用了这个:
RelativeLayout
这给出了我的输出(请记住,当它真的不是时,gif使它看起来不稳定):
答案 1 :(得分:0)
更新了代码:
img = (ImageView) findViewById(R.id.imageView1);
TranslateAnimation animation = new TranslateAnimation(-95.0f, 740.0f,
0.0f, 0.0f); // new TranslateAnimation(xFrom,xTo, yFrom,yTo)
animation.setDuration(5000); // animation duration
animation.setRepeatCount(5); // animation repeat count
img.startAnimation(animation); // start animation