Androidアプリを作成しています。メッセージの場所につながるボタンがあります。ボタンを使用したアクティビティで、未読メッセージがあるかどうかを確認します。ボタンに何かを実行して、未読のものがあることをユーザーに知らせます。
私は、ボタンを2〜3秒ごとに3回振るように水平に振動させることを考えていました。
Xミリ秒ごとに何かを行うスレッドをバックグラウンドで実行する方法を知っています。しかし、私が何をすべきかわからないのは、3回水平に振ることです。
誰でもこれを助けることができますか?
私はsin関数を使用することを考えていました。アニメーションのために、sin関数からの出力を使用して上下する値を取得し、ボタンの水平位置を設定できます...しかし、これは極端すぎるようですより良い方法がありますか?
@omegaのコメントにコメントすることはできません。評判が十分ではありませんが、その質問に対する答えは次のようになります。
shake.xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="100" <!-- how long the animation lasts -->
Android:fromDegrees="-5" <!-- how far to swing left -->
Android:pivotX="50%" <!-- pivot from horizontal center -->
Android:pivotY="50%" <!-- pivot from vertical center -->
Android:repeatCount="10" <!-- how many times to swing back and forth -->
Android:repeatMode="reverse" <!-- to make the animation go the other way -->
Android:toDegrees="5" /> <!-- how far to swing right -->
Class.Java
Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
view.startAnimation(shake);
これはあなたがやりたいことをする一つの方法にすぎません。もっと良い方法があるかもしれません。
animフォルダーにshake.xmlを作成します
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fromXDelta="0"
Android:toXDelta="10"
Android:duration="1000"
Android:interpolator="@anim/cycle" />
animフォルダー内のcycle.xml
<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:cycles="4" />
コードにアニメーションを追加します
Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
anyview.startAnimation(shake);
垂直方向のアニメーションが必要な場合は、fromXdeltaとtoXdeltaの値をfromYdeltaとtoYdeltaの値に変更します
リポジトリの最後にあるルートbuild.gradleに追加します。
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}}
依存関係を追加dependencies { compile 'com.github.varunest:sparkbutton:1.0.5' }
<com.varunest.sparkbutton.SparkButton
Android:id="@+id/spark_button"
Android:layout_width="40dp"
Android:layout_height="40dp"
app:sparkbutton_activeImage="@drawable/active_image"
app:sparkbutton_inActiveImage="@drawable/inactive_image"
app:sparkbutton_iconSize="40dp"
app:sparkbutton_primaryColor="@color/primary_color"
app:sparkbutton_secondaryColor="@color/secondary_color" />
SparkButton button = new SparkButtonBuilder(context)
.setActiveImage(R.drawable.active_image)
.setInActiveImage(R.drawable.inactive_image)
.setDisabledImage(R.drawable.disabled_image)
.setImageSizePx(getResources().getDimensionPixelOffset(R.dimen.button_size))
.setPrimaryColor(ContextCompat.getColor(context, R.color.primary_color))
.setSecondaryColor(ContextCompat.getColor(context, R.color.secondary_color))
.build();
import Android.view.View;
import Android.view.animation.Animation;
import Android.view.animation.Transformation;
public class HeightAnimation extends Animation {
protected final int originalHeight;
protected final View view;
protected float perValue;
public HeightAnimation(View view, int fromHeight, int toHeight) {
this.view = view;
this.originalHeight = fromHeight;
this.perValue = (toHeight - fromHeight);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
view.getLayoutParams().height = (int) (originalHeight + perValue * interpolatedTime);
view.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
}
uss to:
HeightAnimation heightAnim = new HeightAnimation(view, view.getHeight(), viewPager.getHeight() - otherView.getHeight());
heightAnim.setDuration(1000);
view.startAnimation(heightAnim);