2015-05-04 51 views
0

我想通過動畫向視圖添加視圖。我希望通過從屏幕左側滑入並通過以相同方式滑出來出現視圖。通過從左側滑入來添加視圖

我無法得到這個工作。片段出現時,視圖已經可見,沒有動畫。當我按回來解散片段時,視圖向右移動。

這裏的視圖類:

public class BannerView extends LinearLayout { 

    Context context; 

    public BannerView(Context context) { 
     super(context); 
     this.context = context; 
     View.inflate(context, R.layout.heading_view, this); 


    } 

    public BannerView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.context = context; 
     View.inflate(context, R.layout.heading_view, this); 

    } 

    public BannerView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context = context; 
     View.inflate(context, R.layout.heading_view, this); 
    } 

    public void show(final LinearLayout viewGroup){ 

     final LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT); 
     viewGroup.addView(this,p); 

    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 

     Animation anim_list = AnimationUtils.loadAnimation(context, R.anim.slide_in); 
     LayoutAnimationController controller = new LayoutAnimationController(anim_list, 0.1f); 

     setLayoutAnimation(controller); 
    } 
} 

動畫XML是

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="-100%" android:toXDelta="0%" android:duration="1000"/> 
</set> 

這是我如何添加視圖:

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 

     super.onActivityCreated(savedInstanceState); 

     BannerView b = new BannerView(getActivity()); 
     b.show((LinearLayout) getView().findViewById(R.id.footerContainerLayout)); 
    } 

我真的很感激有幫助此

+0

那麼當你運行它會發生什麼? – Clyde

+0

我已更新我的問題 –

+0

嘗試使用http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/frameworks/base/core/中的動畫res/res/anim/slide_in_left.xml?av = f –

回答

1

T他會解決你的問題

myView.startAnimation(AnimationUtils.loadAnimation(mContext, android.R.anim.slide_out_left)); 
+0

你說得對,這確實解決了我的問題。謝謝! –

+0

很高興聽到.... –

0

我以另一種方式做到這一點,你可以嘗試我的代碼:(這是一個完整的項目)。您也可以下載完整的項目here

1)activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:id="@+id/frameToReplace" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    </FrameLayout> 


</LinearLayout> 

2)MainActivity.class

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    Fragment fragment = FragmentParent.newInstance(); 
    getFragmentManager().beginTransaction().replace(R.id.frameToReplace,fragment).commit(); 
} 

3)mdemir_layout.xml - 在這裏發生>動畫。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 


    <Button 
     android:id="@+id/btn_Click" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Add View"/> 
    <RelativeLayout 
     android:id="@+id/rlt" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    </RelativeLayout> 

    <FrameLayout 
     android:id="@+id/fragInvi" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     android:visibility="invisible" 
     android:background="#253"> 

    </FrameLayout> 

</LinearLayout> 

4)FragmentParent.class

public class FragmentParent extends Fragment { 

    public FragmentParent(){ 

    } 

    public static FragmentParent newInstance(){ 
     return new FragmentParent(); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.mdemir_layout,container,false); 

     final FrameLayout fragInvi = (FrameLayout)rootView.findViewById(R.id.fragInvi); 
     Fragment fragment = FragmentForStefanFalk.newInstance(); 

     getFragmentManager().beginTransaction().replace(R.id.fragInvi,fragment).commit(); 
     //Prepair for translating View 
     final int screenWidth = dpToPx(getResources().getConfiguration().screenWidthDp); 
     // translate fragInvi to exact position and prepair size 
     fragInvi.setTranslationX(-screenWidth); 
     fragInvi.setTranslationY(-dpToPx(200)); 

     setLayoutSize(fragInvi,screenWidth,dpToPx(200)); 
     final boolean[] isTranslated = {false}; 

     Button btn_Click = (Button)rootView.findViewById(R.id.btn_Click); 
     // translate view with animation when button is Clicked 
     btn_Click.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(!isTranslated[0]){ 
        fragInvi.setVisibility(View.VISIBLE); 
        fragInvi.setTranslationX(0); 
        fragInvi.setTranslationX(-screenWidth); 
        fragInvi.animate().translationX(0).setDuration(1000); 
       }else{ 
        fragInvi.animate().translationX(fragInvi.getWidth()).setDuration(1000); 
       } 
       isTranslated[0] = !isTranslated[0]; 
      } 
     }); 

     return rootView; 
    } 
    private static void setLayoutSize(View view, int width, int height) { 
     ViewGroup.LayoutParams params = view.getLayoutParams(); 
     params.width = width; 
     params.height = height; 
     view.setLayoutParams(params); 
    } 
    private int dpToPx(int dp) { 
     return (int) (dp * getResources().getDisplayMetrics().density + 0.5f); 
    } 
} 

5. stefan_falk_frame.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ListView 
     android:id="@+id/lv_test" 
     android:background="#253" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    </ListView> 

</LinearLayout> 

6)FragmentForStefanFalk.java

public class FragmentForStefanFalk extends Fragment { 

    public FragmentForStefanFalk(){ 

    } 

    public static FragmentForStefanFalk newInstance(){ 
     return new FragmentForStefanFalk(); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.stefan_falk_frame,container,false); 
     ListView lv_test = (ListView) rootView.findViewById(R.id.lv_test); 
     List<String> arr = new ArrayList<>(); 
     for(int i = 0;i < 10; i++){arr.add("String "+i);} 
     ArrayAdapter adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, arr); 
     lv_test.setAdapter(adapter); 
     lv_test.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Toast.makeText(getActivity(), "Click on " + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     return rootView; 
    } 

好的,這是所有。只需測試並告訴我結果。