动画搜索栏进度

时间:2011-06-05 14:28:18

标签: android animation seekbar

我有一个带有4个搜索条的屏幕(如下图所示)。如果用户移动B,C或D,则计算A的平均值和A的setProgress到平均值。这很容易。我想要做的是为进度条A设置动画,使其不会一次跳转(例如从25-75)。

为A设置动画的推荐方法有哪些?我得到了一个简单的动画,但是我每50ms调用一次TimerTask来增加或减少A的单位值,直到达到所需的位置。但它效率不高。

注意:我有一个自定义Seekbar对象,我使用它创建了seekBar的A,B,C& D.对不起,我不能真正分享代码,但很乐意澄清任何事情。

enter image description here

6 个答案:

答案 0 :(得分:11)

我猜它为时已晚。但我找到了一种使用ValueAnimator实现这一目标的方法。

ValueAnimator anim = ValueAnimator.ofInt(0, seekBar.getMax());
anim.setDuration(1000);
anim.addUpdateListener(new AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
    int animProgress = (Integer) animation.getAnimatedValue();
    seekBar.setProgress(animProgress);
    }
});
anim.start();

答案 1 :(得分:2)

这适用于任何Android版本,不使用任何动画。

<View key={answer.ID}>
  <OnTouchHighlightWidget key={answer.ID} onPress={() =>  {this.props.onSelect(answer)}}>
           <Image source={this.getImageUrl(answer)} style={{flex:1,margin:10,width: 90, height: 95}} />
</OnTouchHighlightWidget>
</View>

答案 2 :(得分:1)

我是使用private void animateProgression(int progress) { final ObjectAnimator animation = ObjectAnimator.ofInt(mySeekBar, "progress", 0, progress); animation.setDuration(3000); animation.setInterpolator(new DecelerateInterpolator()); animation.start(); mySeekBar.clearAnimation(); } 完成的。

import json
import gspread
from oauth2client.client import SignedJwtAssertionCredentials

json_key = ###
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']

credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'], scope)

gc = gspread.authorize(credentials)

sheet = gc.open("worksheet")

sh = sheet.sheet1
dates_array = sh.row_values(2)
col = len(dates_array) 
signin_array = sheet.worksheets()[1:]
id_array = sh.col_values(3)[2:]
	if signin.title in dates_array:
		continue	
	col += 1
	sh.update_cell(2, col, signin.title)
	cell = sh.get_addr_int(2, col)

答案 3 :(得分:0)

如果您使用的是Honeycomb,则可以使用ViewPropertyAnimator http://android-developers.blogspot.com/2011/05/introducing-viewpropertyanimator.html

3.0之前的动画非常有限,但作为方法的替代方法,您可以使用动画监听器:

anim.setAnimationListener(new AnimationListener() {
  public void onAnimationStart(Animation anim) {
     //moveseekbar
  }
  public void onAnimationRepeat(Animation anim) {}
  public void onAnimationEnd(Animation anim) {
     //call animation again if movement not complete
  }
});   

不要忘记调用setFillAfter(boolean fillAfter) 因为动画&lt; 3.0实际上并没有移动视图。它只是给出了观点已经移动的错觉。如果您仍希望搜索栏继续接收触摸,则需要进行重要区分。

答案 4 :(得分:0)

我通过在指数函数上迭代计时器任务而不是单位增量来减少迭代次数。仍然希望得到更好的答案: - )

答案 5 :(得分:0)

我需要的代码就像@sidhanshu_udawat所做的那样。 这是一个很好的基础。大赢,因为它运行在自己的线程上。谢谢你的例子。

然而,当我接受该代码并尝试它时,会出现一个问题,它会增加然后停止。

我修改了代码(粘贴在下面),现在如果您使用以下代码发送搜索栏,您会看到搜索栏在比例尺上下移动。

isRunning - 从您的活动控制

另外,当有人点击按钮时我需要停止动画,所以我在我的Activity上添加了布尔isRunning作为成员。现在当他们点击按钮时,我将isRunnig设置为false并且SeekBar停止。

设置SeekBar,如下所示,然后调用方法:

animSeekBar.incrementProgressBy(1);
  animSeekBar.setMax(100);
  animateSeek(animSeekBar,100);

private void animateSeek(final SeekBar mSeek, final int toVal) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                boolean isIncrementing = true;
                int mProgress = 0;
                isRunning = true;

                while (isRunning) {
                    if (isIncrementing){
                        mProgress++;
                    }
                    else{
                        mProgress--;
                    }
                    mSeek.setProgress(mProgress);
                    if (mProgress >= toVal) {
                        isIncrementing = false;

                    } else if (mProgress <= 0) {
                        isIncrementing = true;
                    }
                    try {
                        Thread.sleep(3);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }