在运行时使用一些动画改变EditText的高度和宽度

11

我有四个不同背景的EditText,如下图所示: 输入图片说明 当EditText被选中时,我想让它全屏覆盖。为此,我需要在运行时使用一些动画更改EditText的宽度和高度。

选中后,它应该像这样: 输入图片说明 如何在运行时使用动画更改EditText的大小?


所以,当请求焦点时,您需要使用动画使EditText占用布局的fill parent。对吗? - Pattabi Raman
@Raman 是的。我已经尝试了你的答案,但那不是我想要的。 - asish
3个回答

6
请在drawable/animation_sample.xml中使用以下代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
<translate android:fromXDelta="0%" android:toXDelta="100%" android:fromYDelta="0%" android:toYDelta="0%" android:duration="500" />

使用以下方法将动画设置为编辑文本:

Animation anim=AnimationUtils.loadAnimation( this, R.anim.righttoleft);
editText = (EditText)findViewById(R.id.editText1);
Display display = getWindowManager().getDefaultDisplay();
int width=display.getWidth();
int height = display.getHeight();
editText.setWidth(width);
editText.setHeight(height);

editText.startAnimation(anim);

4

我不确定是否可以使用Animations实现。在 Android 中,视图会在动画完成之前占据所有空间,因此您会看到其他 editText 消失,选择的 editText 缓慢增加。以下是一个粗略的示例,演示如何在单独的线程中通过更改权重来实现它,而不是使用标准动画:

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
    android:id="@+id/ll0"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/et00"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:gravity="top|left"
        android:text="00" />

    <EditText
        android:id="@+id/et01"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:gravity="top|left"
        android:text="01" />
</LinearLayout>

<LinearLayout
    android:id="@+id/ll1"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/et10"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:gravity="top|left"
        android:text="10" />

    <EditText
        android:id="@+id/et11"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:gravity="top|left"
        android:text="11" />
</LinearLayout>
</LinearLayout>

并在代码中添加改变焦点时的操作:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    OnFocusChangeListener focusListener = new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                LinearLayout parent = (LinearLayout) v.getParent();
                EditText forDecresing = null;
                for (int i = 0; i < parent.getChildCount(); i++) {
                    if (parent.getChildAt(i) != v) {
                        forDecresing = (EditText) parent.getChildAt(i);
                        break;
                    }
                }
                LinearLayout pp = (LinearLayout) parent.getParent();
                LinearLayout layoutForDecreasing = null;
                for (int i = 0; i < pp.getChildCount(); i++) {
                    if (pp.getChildAt(i) != parent && pp.getChildAt(i) instanceof LinearLayout) {
                        layoutForDecreasing = (LinearLayout) pp.getChildAt(i);
                        break;
                    }
                }
                startAnimation((EditText) v, forDecresing, layoutForDecreasing, parent);
            } else {
            }
        }
    };

    ((EditText) findViewById(R.id.et00)).setOnFocusChangeListener(focusListener);
    ((EditText) findViewById(R.id.et01)).setOnFocusChangeListener(focusListener);
    ((EditText) findViewById(R.id.et11)).setOnFocusChangeListener(focusListener);
    ((EditText) findViewById(R.id.et10)).setOnFocusChangeListener(focusListener);
}

public void onBackPressed() {
    setWeight(findViewById(R.id.et00), 1);
    setWeight(findViewById(R.id.et01), 1);
    setWeight(findViewById(R.id.et11), 1);
    setWeight(findViewById(R.id.et10), 1);
    setWeight(findViewById(R.id.ll1), 1);
    setWeight(findViewById(R.id.ll0), 1);
}

Thread animationThread;

private void startAnimation(final EditText forIncreasing, final EditText forDecresing, final LinearLayout layoutForDecreasing,
        final LinearLayout layoutForIncreasing) {
    if (animationThread != null)
        animationThread.interrupt();
    animationThread = new Thread(new Runnable() {
        @Override
        public void run() {
            int iterations = 0;
            int maxIterations = 30;
            setWeight(forIncreasing, maxIterations - 1);
            setWeight(layoutForIncreasing, maxIterations - 1);
            setWeight(forDecresing, maxIterations - 1);
            setWeight(layoutForDecreasing, maxIterations - 1);
            while (iterations < maxIterations) {
                iterations++;
                setWeight(forIncreasing, maxIterations - 1 + iterations);
                setWeight(layoutForIncreasing, maxIterations - 1 + iterations);
                setWeight(forDecresing, maxIterations - 1 - iterations);
                setWeight(layoutForDecreasing, maxIterations - 1 - iterations);
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    return;
                }
            }
            animationThread = null;
        }
    });
    animationThread.start();
}

private void setWeight(final View view, final float weight) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            LayoutParams params = (LayoutParams) view.getLayoutParams();
            params.weight = weight;
            view.setLayoutParams(params);
        }
    });
}

我不知道这对你来说是否可能,但在这个例子中,你可以很容易地添加更多的动作。

如果你有其他选择,我不建议在生产中使用它。


0

我已经尝试解释了我的逻辑来解决你的问题...希望它能对你有用。

EditText editText = new EditText(this);  
editText.setOnClickListener(new OnClickListener() {  

    public void onClick(){    
        // Before getSize was introduced (in API level 13), you could use
        // the getWidth and getHeight methods that are now deprecated:

        Display display = getWindowManager().getDefaultDisplay();   
        int width = display.getWidth();  
        int height = display.getHeight();  

        editText.setWidth(width);  
        editText.setHeight(height);
    }  
}  

1
这就是我所知道的,亲爱的朋友......很抱歉我无法为您提供更多帮助......但是......您可以尝试使用这个动画概念......这是在运行时更改大小的正确方法,也有助于更改动画的大小... - Haresh Chaudhary

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