复制视图以创建视图的精确副本。相对于屏幕移动视图

时间:2014-09-30 21:12:52

标签: java android android-fragments android-animation android-view

正如标题已经表明的那样,我不太清楚要搜索什么来获取我的问题的帮助。我用谷歌搜索了许多我认为合适的术语的不同组合,但直到现在我似乎并没有把事情命名为正确。

目前我正在尝试完成以下操作。 这是它应该如何工作:

我有一个包含不同视图的scrollView。每次用户点击这样的视图时,视图应该被放到前面,独立于scrollView的滚动位置移动到屏幕顶部,最后扩展到新视图。

我也举了一个例子。实际上我正在尝试将其扩展到全屏。 animated example of the problem

我不确定是否必须在我的案例中创建新活动,新片段或视图。我知道在Android L中这会更容易,但我想在4.0 - 4.4中找到一种方法。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

package com.example.anotherviewaddtest;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.view.animation.Animation.AnimationListener;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LinearLayout layout=(LinearLayout) findViewById(R.id.Linear);
        for(int i=0;i<50;i++){ //create a scrollview
            TextView tv=new TextView(this);
            tv.setTextColor(Color.BLUE);
            tv.setText("t\ne\nx\nt\nV\nie\nw "+Integer.toString(i));
            tv.setBackgroundColor(Color.GREEN+10000*i);
            tv.setOnClickListener((new OnClickListener() {
                public void onClick(View v){                    
                    func(v);
                }
               }));
            layout.addView(tv);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void func(View toAdd){

// values for animation x_start
            int toAdd_top=toAdd.getTop();

        ViewGroup root=(ViewGroup) toAdd.getRootView();

//remove view from scrollview       
        ViewGroup parent=(ViewGroup)toAdd.getParent();
        ScrollView itsParent=(ScrollView)parent.getParent();
        parent.removeView(toAdd);
     // animation values x_start, x_end and y_end

int scrolledAmount=itsParent.getScrollY();      
            int margin=itsParent.getTop();
            int scrollView_left=itsParent.getLeft();
            int scrollView_top=itsParent.getTop();
            if(scrolledAmount==0) // fix for first element selected
                scrolledAmount=-scrollView_top;


//gets the main layout of the app and adds the removed to it. Traverse down along your own decor view if it is different . In this example i have decorView->LinearLayout(child at 0)->FrameLayout (child at 1)->main layout of app(child at 0) 
        ViewGroup base=(ViewGroup) ((FrameLayout)((LinearLayout)root.getChildAt(0)).getChildAt(1)).getChildAt(0);
        base.addView(toAdd);


//  set the animation   
        TranslateAnimation ani= new TranslateAnimation(scrollView_left,scrollView_left,-scrolledAmount,-(toAdd_top-margin));
        ani.setDuration(1000);
        toAdd.startAnimation(ani);
//listener to call new activity at end of animation
        ani.setAnimationListener(new AnimationListener(){
            @Override
            public void onAnimationEnd(Animation anim){
                //start new Activity here
            }
            @Override
            public void onAnimationRepeat(Animation arg0) {}
            @Override
            public void onAnimationStart(Animation arg0) {}
            ;});
// removes the view that was added to main layout
        base.removeView(toAdd);
    }
    }

这是一种更简单的方法。这将获取视图,将其添加到0,0的主布局,然后动画以您必须根据需要找到的值开始。在此示例中,只有滚动视图,视图从其在屏幕上的位置转换为滚动视图的顶部。也许你可以用更简单的方式做到这一点,只需用适当的值设置动画并简单地从滚动布局中删除视图但我还没试过呢