Android自动滚动的图片视图

4
在我的活动中,我只有一个ImageView。其中src是一张比屏幕大得多的图片。我想让图片从左到右缓慢滚动,直到达到照片的右边缘,然后开始向左滚动,直到达到左边缘。然后重新开始。 我需要它在一个单独的线程中发生,以便手机在此过程中不会冻结。 这就是我所需要的 如何实现这一点? 是否有默认情况下可以完成此操作的小部件? 更新代码 //布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mylinear"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="center"
        android:src="@drawable/rainforest" />

</RelativeLayout>

//和活动

public class MainActivity extends Activity {

    Animation           _translateAnimation;
    RelativeLayout        _relativeLoading = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        _translateAnimation = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, -100f, TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 0f);
        _translateAnimation.setDuration(5000);
        _translateAnimation.setRepeatCount(-1);
        _translateAnimation.setRepeatMode(Animation.REVERSE); // REVERSE
        _translateAnimation.setInterpolator(new LinearInterpolator());
        _relativeLoading = (RelativeLayout) findViewById(R.id.mylinear);
        _relativeLoading.startAnimation(_translateAnimation);
    }

但是它会偏移图片。 我的意思是,滚动条从左向右滚动,“推”着图片向左,并显示白色背景在ImageView下面。
另外,这应该放在一个线程中吗?我需要能够以某种方式退出此“滚动”活动,而不使用返回按钮。我想在ImageView顶部放置一个按钮(按钮应保持静止),并单击它应启动另一个Intent。
似乎ImageView内的图片被裁剪以适应屏幕。如何解决这个问题?

你应该使用带有某些重复属性的TranslateAnimation。 - An-droid
同时,使用图像制作动画有点卡顿... - Tarun Deep Attri
3个回答

6

所以,对于所有像我一样需要在他们的应用中使用此功能的新安卓开发人员,解决问题的方法在这里:

public class MainActivity extends Activity {

    Animation           _translateAnimation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        _translateAnimation = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, -300f, TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 0f);
        _translateAnimation.setDuration(8000);
        _translateAnimation.setRepeatCount(-1);
        _translateAnimation.setRepeatMode(Animation.REVERSE); // REVERSE
        _translateAnimation.setInterpolator(new LinearInterpolator());
        ImageView img = (ImageView) findViewById(R.id.img);
        img.startAnimation(_translateAnimation);
    }
}

以及页面布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/global_relative"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical"
    >

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="600dp"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@drawable/rainforest"
        android:scaleType="center"
        android:src="@drawable/rainforest613x490" >

    </ImageView>
</ScrollView>  
</RelativeLayout>

请确保您的图像足够大/高以适应屏幕,并且比屏幕宽度宽(+300dp)(或调整上面的代码)。

编码愉快;)


太棒了!对我有用。 - Peter Arandorenko
嘿,我也遇到了同样的问题,你能帮我吗?我已经为此苦苦挣扎了三个小时...谢谢。 - Gowtham Raj
1
不需要滚动视图,关键是将ImageView设置为自定义宽度(600dp),然后设置缩放类型为中心,最后向ImageView添加平移动画。 - Amit Tumkur

2

示例:

private Animation           _translateAnimation;
private ImageView       _image;

_image = (ImageView)findViewById(R.id.yourimage);

_translateAnimation = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 100f, TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 0f);
_translateAnimation.setDuration(10000);
_translateAnimation.setRepeatCount(-1);
_translateAnimation.setRepeatMode(Animation.REVERSE);
_translateAnimation.setInterpolator(new LinearInterpolator());
_image.setAnimation(_translateAnimation);

这将使_linearLoading缓慢地向左和向右移动...

持续时间越长,速度越慢

TranslateAnimation.ABSOLUTE = 使用图像的位置 TranslateAnimation.RELATIVE_TO_PARENT = 使用父布局 ...

TranslateAnimation(起始x,结束x,起始y,结束y)方法

试着玩一下


linearLoading 应该是你想要翻译的内容,这里是你的图像。因此,你必须使用 findviewbyid() 来获取它。 - An-droid
我认为我的错误在于我对ImageView进行了动画处理...而且似乎是因为ImageView将实际图像裁剪为可见大小,因此无论我将翻译放在哪里,白色背景都会出现,而不是显示更多的源图片。我应该怎么做才能看到图片的其余部分而不是背景? - user1137313
如果我使用LinearLayout而不是ImageView,应用程序会崩溃。你能把你使用的整个动画代码放在这里吗?它对我不起作用。它会崩溃。 - user1137313
来吧,整个代码都在这里,而且完美运行。如果你想移动一张图片,你就设置相应的imageview动画;如果你想移动一个布局,你就在布局上设置动画。没有更多要做的了。当然,在此之前你必须使用findViewById获取你想要移动的视图! - An-droid
好的... :) 问题在于我在想要移动它之前没有“找到”linearView。现在它不会崩溃了。但是我仍然看不到整个图片,只能看到背景。请看一下我的布局(在我的问题中编辑)...拜托了... - user1137313
显示剩余8条评论

0
你可以在 ScrollView 中添加 ImageView。像这样:
<ScrollView
    android:id="@+id/img_scroll"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/IMAGENAME" />
</ScrollView>

由于您想要自动滚动图像,因此可以创建一个AsyncTask,在doInBackground()方法中创建一个new RunnablerunOnUiThread(),并使用它的ID发送命令来滚动ScrollView,使其按照您需要的进行滚动。


你能给我一些发送指令到ScrollView的示例代码吗? - user1137313

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接