0

Android gallery についてのこのビデオのように、gallery で写真のフォルダをクリックすると、写真が展開されるようなアニメーションが必要です。

  • 同じカスタム ビューグループに 2 つのビューがあります

    • view1 は 0,0 にあります
    • view2 は 100,100 です
  • 「開始」をクリックすると、view1 は 100,0 に移動し、view2 は 0,100 に移動します。

これまでの私の解決策:

requestlayout による新しい位置でのレイアウトの更新にはタイマーを使用します。

ビューの位置は次のように更新されonLayoutます:

動作しますが、ネイティブ関数ではなく、同時に 100 個のビューが移動すると非常に遅くなります。

完全なコード:

private class MyViewGroup extends ViewGroup{
    View view1,view2;
    Button btn;
    public MyViewGroup(Context context) {
        super(context);
        view1=new View(context);
        view1.setBackgroundColor(Color.RED);
        this.addView(view1);
        view2=new View(context);
        view2.setBackgroundColor(Color.BLUE);
        this.addView(view2);
        btn=new Button(context);
        btn.setText("start");
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                xLayout=0;
                handler.sendEmptyMessage(0);
            }
        });
        this.addView(btn);


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int w = MeasureSpec.getSize(widthMeasureSpec);
        int h= MeasureSpec.getSize(heightMeasureSpec);
        int widthSpec = MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY);
        int heightSpec = MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY);
        view1.measure(widthSpec,heightSpec);
        view2.measure(widthSpec,heightSpec);
        btn.measure(widthSpec,heightSpec);
        this.setMeasuredDimension(w, h);
    }
    private int xLayout=0;
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        view1.layout(xLayout,0,xLayout+50,50);
        view2.layout(100-xLayout,100,150-xLayout,150);
        btn.layout(0,200,50,250);
    }

    private void startAnimation(){
        Timer timer = new Timer() ;
        timer.schedule(new TimerTask(){
            @Override
            public void run() {
                if(xLayout<100){
                    handler.sendEmptyMessage(0);
                }
                this.cancel();
            }

        },5);
    }

    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            xLayout=xLayout+20;
            view1.requestLayout();
            startAnimation();
        }
    }   ;
}
4

2 に答える 2

1

http://android-developers.blogspot.fr/2011/05/introducing-viewproperyanimator.html

myView.animate().x(500).y(500);
于 2012-05-23T07:35:56.383 に答える
0

「LayoutTransition」を次のように使用できます

 final LayoutTransition transitioner = new LayoutTransition();
 myViewGroup.setLayoutTransition(transitioner);

そして、「開始」addviewをクリックすると

完全なコード

 private class MyViewGroup extends ViewGroup{
    View view1,view2;
    Button btn;
    public MyViewGroup(final Context context) {
        super(context);
        view1=new View(context);
        view1.setBackgroundColor(Color.RED);
        this.addView(view1);
        view2=new View(context);
        view2.setBackgroundColor(Color.BLUE);
        this.addView(view2);
        btn=new Button(context);
        btn.setText("start");
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                xLayout+=100;
              MyViewGroup.this.addView(new View(context));
            }
        });
        this.addView(btn);


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int w = MeasureSpec.getSize(widthMeasureSpec);
        int h= MeasureSpec.getSize(heightMeasureSpec);
        int widthSpec = MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY);
        int heightSpec = MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY);
        view1.measure(widthSpec,heightSpec);
        view2.measure(widthSpec,heightSpec);
        btn.measure(widthSpec,heightSpec);
        this.setMeasuredDimension(w, h);
    }
    private int xLayout=0;
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        view1.layout(xLayout,0,xLayout+50,50);
        view2.layout(100-xLayout,100,150-xLayout,150);
        btn.layout(0,200,50,250);
    }


}
于 2012-05-22T10:25:24.573 に答える