lắc / lắc chế độ xem hoạt hình trong Android


82

Tôi đã tạo một tệp anim.xml chẳng hạn như bên dưới để lắc imageview giống như biểu tượng IOS lắc trong Android. Tuy nhiên nó không cung cấp cho tôi kết quả tương tự. Có ý tưởng nào tốt hơn không?

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"

    android:fromDegrees="-2"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:toDegrees="2" />

Câu trả lời:


171

Thử cài đặt android:repeatMode="reverse". Hình ảnh động bên dưới tạo ra một mô phỏng rất hợp lý trên Galaxy Nexus của tôi. Rõ ràng là bạn có thể tinh chỉnh các thông số theo ý mình.

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="100"
    android:fromDegrees="-5"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:toDegrees="5" />

Tôi mới phát triển Android, tôi đang sử dụng Xamarin, bạn có thể vui lòng cho tôi biết làm cách nào để áp dụng hoạt ảnh này cho hình ảnh / nút trên bất kỳ sự kiện nào như nhấp chuột, v.v.
NK

@NK: Nó sẽ hoạt động giống như trong Java: tải hoạt ảnh bằng ID tài nguyên của nó và yêu cầu chế độ xem của bạn bắt đầu hoạt ảnh bằng cách chuyển nó làm tham số. Nên giống như thế: view.StartAnimation(AnimationUtils.LoadAnimation(Resource.Animation.wobble)). Thêm chi tiết ở đâyở đây .
MH.

3
Làm thế nào chúng ta có thể thêm thời gian trễ giữa các lần lắc. Ví dụ hiển thị rung 500 ms sau đó trễ 1000 ms rồi lặp lại?
Damir Mailybayev

73

Hoạt hình lắc đẹp ;

res / anim / lắc.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate android:duration="150"
        android:fromXDelta="-10%"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:toXDelta="10%"/>
</set>

Làm thế nào để sử dụng nó

final Animation animShake = AnimationUtils.loadAnimation(this, R.anim.shake);
btn_done = (Button) findViewById(R.id.btn_act_confirm_done); 
btn_done.startAnimation(animShake);

Cách sử dụng (Phiên bản đơn giản hơn):

btn_done.startAnimation(AnimationUtils.loadAnimation(this,R.anim.shake));

2
android:duration="50"nhìn cách ít hay thay đổi trong quan điểm của tôi và vẻ muich tốt hơn
Ab

45

Bạn có thể thử điều này:

lắc.xml

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
           android:fromXDelta="0" 
           android:toXDelta="10" 
           android:duration="1000" 
           android:interpolator="@anim/cycle_7" />

cycle_7.xml

<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
                   android:cycles="7" />

9
này, tôi đoán cycle_7.xmlcó thể được thay thế thành android:repeatCount="7"thuộc tính trong<translate .../>
Anup

28

cố gắng sử dụng cái này:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="70"
        android:fromDegrees="-5"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:interpolator="@android:anim/linear_interpolator"
        android:toDegrees="5" />
    <translate
        android:fromXDelta="-10"
        android:toXDelta="10"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:interpolator="@android:anim/linear_interpolator"
        android:duration="70" />
</set>

19

Để tạo hiệu ứng lắc như thế này

nhập mô tả hình ảnh ở đây

Đầu tiên hãy xác định hoạt ảnh lắc bên trong thư mục hoạt ảnh là lắc.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="70"
        android:fromDegrees="-5"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:toDegrees="5" />
    <translate
        android:duration="70"
        android:fromXDelta="-10"
        android:interpolator="@android:anim/linear_interpolator"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:toXDelta="10" />
</set>

Sau đó, trong mã

if (TextUtils.isEmpty(phone.getText())
 || phone.getText().length() < 10)
    {
     //shake animation
    phone.startAnimation(AnimationUtils.loadAnimation(getActivity(), R.anim.shake));
     }

14

Tôi đã tạo hiệu ứng rung lắc trên Android và đăng trên GitHub. Xem nếu nó hoạt động tốt hơn.

https://github.com/teoinke/ShakeAnimation

Mã liên quan:

<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/overshoot_interpolator"
    android:fillAfter="true">

    <translate
        android:startOffset="100"
        android:fromXDelta="0%p"
        android:toXDelta="10%p"
        android:duration="50" />

    <translate
        android:startOffset="150"
        android:fromXDelta="0%p"
        android:toXDelta="-25%p"
        android:duration="110" />


    <translate
        android:startOffset="260"
        android:fromXDelta="0%p"
        android:toXDelta="25%p"
        android:duration="120" />


    <translate
        android:startOffset="380"
        android:fromXDelta="0%p"
        android:toXDelta="-20%p"
        android:duration="130" />


    <translate
        android:startOffset="510"
        android:fromXDelta="0%p"
        android:toXDelta="10%p"
        android:duration="140" />

</set>

1
Đối với tôi, đây là câu trả lời tốt nhất, vì nó hoạt hình từ trung tâm và không bù đắp hình ảnh ngay lập tức như một số gợi ý khác. Chuyên nghiệp!
Jonathan Dunn

13

Cái này hoạt động khá tốt (mặc dù không hoàn hảo) như một bản sao rung "sai mã PIN" iOS:

    final float FREQ = 3f;
    final float DECAY = 2f;
    // interpolator that goes 1 -> -1 -> 1 -> -1 in a sine wave pattern.
    TimeInterpolator decayingSineWave = new TimeInterpolator() {
                @Override
                public float getInterpolation(float input) {
                    double raw = Math.sin(FREQ * input * 2 * Math.PI);
                    return (float)(raw * Math.exp(-input * DECAY));
                }
            };

    shakeField.animate()
            .xBy(-100)
            .setInterpolator(decayingSineWave)
            .setDuration(500)
            .start();

5
/**
 *
 * @param view      view that will be animated
 * @param duration  for how long in ms will it shake
 * @param offset    start offset of the animation
 * @return          returns the same view with animation properties
 */
public static View makeMeShake(View view, int duration, int offset) {
    Animation anim = new TranslateAnimation(-offset,offset,0,0);
    anim.setDuration(duration);
    anim.setRepeatMode(Animation.REVERSE);
    anim.setRepeatCount(5);
    view.startAnimation(anim);
    return view;
}

sử dụng:

TextView tv;
makeMeShake(tv,20,5);    // it will shake quite fast

Hoạt động hoàn hảo và rất nhanh.
George Vrynios

3

Tôi đã tạo ra một ước lượng rất tốt về độ rung của iOS (khi bạn nhấn và giữ một biểu tượng để xóa ứng dụng khỏi màn hình chính). Bạn phải áp dụng bên trong mã của mình, theo chương trình, vì nó yêu cầu tạo số ngẫu nhiên:

int dur1 = 70 + (int)(Math.random() * 30);
int dur2 = 70 + (int)(Math.random() * 30);

// Create an animation instance
Animation an = new RotateAnimation(-3, 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

// Set the animation's parameters
an.setDuration(dur1);               // duration in ms
an.setRepeatCount(-1);                // -1 = infinite repeated
an.setRepeatMode(Animation.REVERSE);
an.setFillAfter(true);               // keep rotation after animation


// Create an animation instance
Animation an2 = new TranslateAnimation(-TranslateAnimation.RELATIVE_TO_SELF,0.02f,
        TranslateAnimation.RELATIVE_TO_SELF,0.02f,
        -TranslateAnimation.RELATIVE_TO_SELF,0.02f,
        TranslateAnimation.RELATIVE_TO_SELF,0.02f);

// Set the animation's parameters
an2.setDuration(dur2);               // duration in ms
an2.setRepeatCount(-1);                // -1 = infinite repeated
an2.setRepeatMode(Animation.REVERSE);
an2.setFillAfter(true);               // keep rotation after animation

AnimationSet s = new AnimationSet(false);//false means don't share interpolators
s.addAnimation(an);
s.addAnimation(an2);

// Apply animation to image view
itemView.setAnimation(s);

Mã này được thiết kế để áp dụng bên trong chế độ xem lưới (getView) của bộ điều hợp, nhưng bạn có thể áp dụng cho bất kỳ chế độ xem nào bằng cách thay đổi dòng cuối cùng thành:

yourViewName.setAnimations (các);


Có vẻ như nó không làm gì cả
25

Hãy nhớ rằng điều này sẽ chỉ hoạt động nếu itemViewchưa được thêm vào ViewGroup. Nếu nó đã được thêm, hãy sử dụng itemView.startAnimation(s)thay thế.
Alex Semeniuk

2

Đối với người dùng Kotlin:

Đầu tiên, hãy tạo một tệp tài nguyên Hoạt hình có tên là lắc.xml . Nhấp chuột phải vào thư mục res trong Android Studio, sau đó nhấp vào Mới> Tệp tài nguyên Android> nhập lắc cho tên tệp và chọn Hoạt ảnh cho loại tài nguyên thả xuống. Bấm OK.

Bên trong shake.xmldán như sau:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:duration="200"
               android:fromXDelta="-5%"
               android:repeatCount="3"
               android:repeatMode="reverse"
               android:toXDelta="5%"/>
</set>

Bây giờ chỉ cần gọi nó trên một lượt xem!

Từ bên trong một mảnh:

myView.startAnimation(AnimationUtils.loadAnimation(view!!.context, R.anim.shake))

Từ bên trong một hoạt động:

myView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.shake))

(lưu ý - myViewlà ID được cấp cho chế độ xem mà bạn muốn tạo hoạt ảnh)

Nếu bạn muốn tinh chỉnh hoạt ảnh, chỉ cần sửa đổi các giá trị trong shake.xml.


startAnimationanim(trong R.anim.shake) đều là tài liệu tham khảo chưa được giải quyết, bạn có thể giúp đỡ không? cảm ơn
Maff 19/09/19

bạn cần tạo thư mục hoạt ảnh trong thư mục res @Maff
Aditya Patil

0

Hoạt ảnh lung lay iOS không đơn giản là cố gắng thay đổi trục x và y ngẫu nhiên khi xoay. Tuy nhiên, bạn nên thay đổi giá trị theo chương trình. Có thể bạn cũng có thể sử dụng dịch hoạt ảnh đồng thời


0

Đập đầu hơn hai tiếng, tôi đã biết lắc lư, chao đảo một góc nhìn.

Rất tiếc, câu trả lời được chấp nhận sẽ không hoạt động ngoài onCreateView của phân mảnh.

Ví dụ nếu bạn có phương thức onClick và bên trong nó. Bạn có hoạt ảnh như bên dưới nó sẽ không hoạt động.

Vui lòng xem qua mã.

    DoneStart.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {
           register(view);

        }
    });

Phương thức đăng ký có một số kiểm tra như mã dưới đây

 private void register(View view) {
    String type = typedThings.getText.toString(); 
   String  km = Km_Now.getText().toString();

    if (serviceType == null) {
        animationServiceList = AnimationUtils.loadAnimation(getActivity(), R.anim.shake_wobble);
        silverServiceButton.setAnimation(animationServiceList);
        generalServiceButton.setAnimation(animationServiceList);
        platinumServiceButton.setAnimation(animationServiceList);
        animationServiceList.start();
    } else if (km == null) {
        animationEditText = AnimationUtils.loadAnimation(getActivity(), R.anim.shake_wobble);
        Km_Now.setAnimation(animationEditText);
        animationEditText.start();
    }

Cuộc gọi animationServiceList.start (); sẽ không bao giờ được gọi,

GIẢI PHÁP: Sử dụng PropertyAnimator như ObjectAnimator.


0

Các câu trả lời khác cũng đúng nhưng câu trả lời này mượt hơn một chút vì nó sử dụng bộ nội suy tạo ra các con số mượt mà cho chuyển động qua lại

    public class WobblyView extends ImageView implements ValueAnimator.AnimatorUpdateListener {
    private final ValueAnimator va = ValueAnimator.ofInt(-10, 10);

    public WobblyView(Context context) {
        this(context, null);
    }

    public WobblyView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public WobblyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setAdjustViewBounds(true);
        setImageResource(R.drawable.ic_logo);
        va.setInterpolator(new AccelerateDecelerateInterpolator());
        va.setRepeatMode(ValueAnimator.REVERSE);
        va.setRepeatCount(ValueAnimator.INFINITE);
        va.setDuration(1000);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        va.addUpdateListener(this);
        va.start();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        va.removeUpdateListener(this);
    }

    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int heading = (int) animation.getAnimatedValue();
        setRotation(heading);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.