Android版—上位ビューの画面上では?
質問
ようにしているアニメーションするために単純なImageViewアダプタのご使用をやっていない場合については、スライドから画面下のとお越しの休憩のトップ50pxのビューは画面上部のテキスト(例えば位置を最終ImageViewき-50px X).私は利用しようとしたのAbsoluteLayoutこのためには、この実際にカットし、トップ50pxのImageViewの上50pxは描画されます。いサポート事業部を立ち上げてい50pxのImageView可視-描画されながらものを使用してアニメーション化しないで来て、残りわずかにリングに仕上がっている。私は私の説明も十分です。
ここでは、私が現在使用してレイアウトやスライド-アニメーション(これは現在のとな描画の50pxのImageView):
レイアウト:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:id="@+id/QuickPlayClipLayout">
<ImageView android:id="@+id/Clip"
android:background="@drawable/clip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_y="-50dp">
</ImageView>
</AbsoluteLayout>
メーカー
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%p"
android:toYDelta="0"
android:duration="1000"/>
<alpha android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="1000" />
</set>
よろしくお願いします。
解決
私は、実装が容易である必要があり、この解決策を考え出しました。これは、レイアウトやレイアウトを膨らませる活動を変更する必要...下記参照してください。
アクティビティ(QuickPlay.java):
public class QuickPlay extends Activity implements AnimationListener
{
private ImageView myImageView;
private LinearLayout LL;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.quick_play_screen);
myImageView = (ImageView) this.findViewById(R.id.Clip);
LL = (LinearLayout) this.findViewById(R.id.QuickPlayClipLayout);
//finally
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_in_quickplay);
anim.setAnimationListener(this);
LL.startAnimation(anim);
}
@Override
public void onAnimationEnd(Animation animation){}
@Override
public void onAnimationRepeat(Animation animation){}
@Override
public void onAnimationStart(Animation animation)
{
// This is the key...
//set the coordinates for the bounds (left, top, right, bottom) based on the offset value (50px) in a resource XML
LL.layout(0, -(int)this.getResources().getDimension(R.dimen.quickplay_offset),
LL.getWidth(), LL.getHeight() + (int)this.getResources().getDimension(R.dimen.quickplay_offset));
}
}
新規のLinearLayout(CustomLinearLayout.java):
public class CustomLinearLayout extends LinearLayout
{
private Context myContext;
public CustomLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
myContext = context;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec+((int)myContext.getResources().getDimension(R.dimen.quickplay_offset)));
}
}
レイアウト(/res/layout/quick_play_screen.xml):
<?xml version="1.0" encoding="utf-8"?>
<com.games.mygame.CustomLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:id="@+id/QuickPlayClipLayout">
<ImageView android:id="@+id/Clip"
android:background="@drawable/clip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ImageView>
</com.games.mygame.CustomLinearLayout>
リソース(/res/values/constants.xml):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="quickplay_offset">50dp</dimen>
</resources>
アニメーション(/res/anim/slide_in_quickplay.xml):
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%p"
android:toYDelta="0"
android:duration="1000"/>
<alpha android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="1000" />
</set>
プログラムは、今、私はそれが何をする必要があるかを正確に行います。全体のレイアウトは、底部にスクリーンをオフ開始1秒内にスライドレイアウトの上面が実際は50px画面の上から(すなわちLL.getTop() = -50
)であり、レイアウトの底部は底部で静止している静止します画面の(すなわちLL.getBottom() = 530 = 480 + 50
)。
他のヒント
の代わりに私たちすることができますlayout_marginへの単純な弾力の負の値(トップ/左/右/下) 例えば:あなたはあなたのビューが画面の上部からオフにしたい場合は、指定することができます。
android:layout_marginTop="-40dp"
の位置にもオフスクリーンを使って以下のコード:
View myView = /* view you want to position offscreen */
int amountOffscreen = (int)(myView.getWidth() * 0.8); /* or whatever */
boolean offscreen = /* true or false */
int xOffset = (offscreen) ? amountOffscreen : 0;
RelativeLayout.LayoutParams rlParams =
(RelativeLayout.LayoutParams)myView.getLayoutParams();
rlParams.setMargins(-1*xOffset, 0, xOffset, 0);
myView.setLayoutParams(rlParams);
このコード位置myViewオフスクリーンによるamountOffscreenは、この場合、重の80%のオフスクリーンには、多くの20%を押.
使用しないレイアウトに()メソッドを直接-Androidをそれ以降の呼び出しを無効にするには自分の見たいだけlayoutParamsが続き全体を無効にします。もし興味があるのなら、あなたの、チェックアウトライン 904に912このファイル 見てください修正のlayoutParams.
これは、 Canvas
;これらは、問題なく画面外に描画することをサポートします。ただし、実装はさらに複雑になります。カスタムを実装する必要があります View
コードで独自のアニメーションを記述します。基本的に、これは組み込みの XML アニメーションを使用したビューではなく、単純な 2D グラフィックスの処理に帰着します。XML を使用してそれを行う方法があるかもしれませんが、私はキャンバスのほうに慣れています。これがコードでどのように処理されるかを確認するのに非常に適した場所は、SDK に付属している Lunar Lander のサンプル ゲームです。
大まかに従う必要がある手順は次のとおりです。
次のようなものを使用して、XML ファイルにカスタム ビューを配置します。
<your.package.AnimatingView>
, 、そのサイズを fill-parent に設定します。次に、AnimatingView クラスを定義します。
extends SurfaceView and implements SurfaceHolder.Callback
. 。(これにより、図面にアクセスできるようになります)Canvas
を使用するのではなく、すぐにinvalidate()
方法。これは重要です。invalidate() はスレッドがアイドル状態のときにのみ更新されるためです。ループの最後に。アニメーションを実装するには、すぐに描画する必要があります)。次に、画面全体に動画を描画するループを実装できます。このループは、背景全体を描画することから開始し (キャンバスは自動的に消去されないため)、その後、経過時間に基づいて新しい位置に画像を描画する必要があります。たとえば、アニメーションの実行に 1 秒かかる場合、200 ミリ秒が経過した場合、ビューは開始位置から最終位置まで 200/1000、つまり 1/5 だけ移動するはずであることがわかります。 。
アニメーションに関する質問に対する私の他の回答で、私が言いたいことの例をいくつか見ることができます。についての基本的な返答 SurfaceView を使用することの有用性 そしてそして 使用するループの例. 。注記:2 番目の質問は回転に関するものでした。したがって、私が話したいくつかの問題はあなたには関係ありません。幸運を!
でandroid:translationX
とandroid:translationY
<RelativeLayout
android:translationX="-600dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
私は子供たちとのViewGroupを持っていたし、下から画面にビューをドラッグして - 一種の引き出しのように。私は、手放すだろうとのViewGroupトップマージンが画面の上半分にした場合、ユーザーがタッチをリリースした後、私はトップにそれをアニメーション化します。
これはのViewGroupの子供の画像がアニメーション中にトリミングになるだろうが、その後、アニメーションの後に示さなるだろう。起きたとき
問題は:のViewGroupの高さはwrap_contentました。私はアニメーションを開始する前に画面の外に伸びていることの値に高さを設定することでこれを解決します。