私はレイアウトを膨らませて画面に表示します。 今、レイアウトから部分的にレイアウトを移動したいと思います。私は、膨らんだレイアウトで.animate().translationX(-500)
を使ってみました。それは私がそれを見てみたかった正確にどのように画面をオフに移動:後膨らんだレイアウト/ビューをアニメーションで新しい位置に移動
:
しかし、今、私は問題を抱えている前
レイアウトが元々占めていた領域はクリック可能ではありません(例:ホーム画面間でスワイプすることはできません。青色のマークされた領域の外側で働く)。どのように私は青い領域が移動した後にクリック可能ですが、私は後ろにそれを移動したい場合には、レイアウト(赤い部分)のremaing面積は依然としてクリック(例えばを登録することができ、ことを解決することができ
onClickListener)? 私はwindowManager
のupdateViewLayout()
の機能と一緒に働かなければならないと思いますが、私はパラメータに関して何を変更すべきか分かりません。
編集1:ここでは
はコードです。翻訳はボタンによってトリガーされます。
overlay.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d8ff0000"
android:weightSum="1">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="245dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Lorem ipsum "
android:id="@+id/textView6"
android:layout_marginLeft="10dp" />
<Button
android:layout_width="55dp"
android:layout_height="wrap_content"
android:text="X"
android:id="@+id/button"
android:layout_gravity="center_horizontal|top"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/textView6"
android:layout_marginStart="27dp" />
</RelativeLayout>
</LinearLayout>
レイアウトを膨張させるサービス:
OverlayService.java
public class FloatingMenu extends Service{
private WindowManager wm;
private LinearLayout ll;
private boolean isPushedToSide = true;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
ll = new LinearLayout(this);
LinearLayout.LayoutParams llParameters = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
ll.setBackgroundColor(Color.argb(50, 255, 255, 255));
ll.setLayoutParams(llParameters);
final WindowManager.LayoutParams parameters = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
parameters.gravity = Gravity.LEFT | Gravity.TOP;
LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
ll = (LinearLayout) li.inflate(R.layout.overlay, null);
final Button b = (Button) ll.findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isPushedToSide) {
ll.animate().translationX(0);
isPushedToSide = false;
}else {
ll.animate().translationX(-450);
isPushedToSide = true;
}
}
});
wm.addView(ll, parameters);
}
}
編集2:
私の研究を続けながら、.animate().translationX()
は、ビュー自体が表示されるのではなく、ビューがレンダリングされる位置だけを移動させることがわかりました。これはまた、.animate().translationX()
を使用した後も、onclickイベントがレイアウトを "移動"する前と同じ位置でトリガされる理由を説明します。
今、アニメーションと組み合わせて実際のビューを希望の位置に移動する方法を見つける必要があります。任意のアイデアをどのように行うには?
編集3: 私は同様の問題を持つポストの多くを発見し、私が正しい場合、問題を解決するには、ObjectAnimator
代わりの.animate().translationX()
を使用しています。 onClickListener
は次のようになりますように、私は、私のコードでその部分を交換してみました:
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isPushedToSide) {
//ll.animate().translationX(0);
ObjectAnimator.ofFloat(ll, "translationX", 0).setDuration(250).start();
isPushedToSide = false;
}else {
//ll.animate().translationX(-450);
ObjectAnimator.ofFloat(ll, "translationX", -450).setDuration(250).start();
isPushedToSide = true;
}
}
});
ll
は、私がLorem ipsum
テキストやButton
を含む、膨らませてきたのLinearLayoutです。 アニメーション自体は正常に動作しますが、同じように動作します。私はまだonClickListener
を発射するためにボタンの元の位置をクリックする必要があり、青色の領域はまだクリックできません。
編集4:
は、実際の位置を更新するために.invalidate()
を使用するための提案をしようとしていました。しかし、それは動作しませんでした。私はそれが正しい使用されているかどうかはわかりません。
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isPushedToSide) {
//ll.animate().translationX(0);
ObjectAnimator.ofFloat(ll, "translationX", 0).setDuration(250).start();
ll.invalidate();
isPushedToSide = false;
}else {
//ll.animate().translationX(-450);
ObjectAnimator.ofFloat(ll, "translationX", -450).setDuration(250).start();
ll.invalidate();
isPushedToSide = true;
}
}
});
私もLayoutParams
のx値を変更し、うまく働いたwm.updateViewLayou(ll, updatedParameters)
を、呼び出してみました。オーバーレイを100ピクセル右に移動すると、onClickListener
をトリガーする領域も100ピクセル右に移動します。問題は、私は実際の画面の境界内でオーバーレイを移動することができただけであり、必要なのはスクリーンから外すことです。負の値を結んだが、それもうまくいかなかった。
本質的に必要なのは、引き出しのナビゲーションですが、高さが限られています(少なくとも私が必要と考えるものです)。そういうふうに正しく働くものが得られるかどうか見てみましょう。
編集5:
ObjectAnimatorのアニメーション= ObjectAnimator.ofFloat(LL、「translationX:アニメーションが終了したときに.inflate()
が呼び出されますが、それはまだ同じように動作するように
は私のコードを修正しました"、0).setDuration(250);
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {}
@Override
public void onAnimationEnd(Animator animator) {
b.invalidate();
text.invalidate();
frame.invalidate();
ll.invalidate();
}
@Override
public void onAnimationCancel(Animator animator) {}
@Override
public void onAnimationRepeat(Animator animator) {}
});
anim.start();
また、問題を示す2つの.gifが記録されました。私はgravity
をCENTER
に設定しました。
しかし、その方法ではまだレイアウトのすべてのコンテンツが表示されず、新しい幅に合わせて一緒に押しつぶされますか? – 0x1234
はい、それはあなたのレイアウトのサイズを変更します、あなたはexectlyあなたのレイアウトの一部を非表示にする必要がありますか?コードのスニペットを表示できますか?アニメーションの部分 – dosssik
はい、後でコンテンツを追加したときに、幅プロパティを変更するだけでよく見えません。私は後で開始ポストに自分のコードを追加します。 – 0x1234