খণ্ডের লেনদেন অ্যানিমেশন: স্লাইড ভিতরে এবং স্লাইড আউট


104

আমি টুকরাগুলির মধ্যে অ্যানিমেট লেনদেনের জন্য কিছু টিউটোরিয়াল পরীক্ষা করেছি check আমি এনিমেশনের জন্য এই পদ্ধতিটি ব্যবহার করেছি এবং এটি কাজ করে:

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left,
                android.R.anim.slide_out_right);

তবে আমি এই অ্যানিমেশনটি উল্টাতে চাই: পুরানো টুকরাটি বাম দিকে স্লাইড এবং ডানদিকে নতুন টুকরা স্লাইড, তবে R.animফাইলের কোনও মান আমার সুযোগের জন্য কার্যকর বলে মনে হচ্ছে না।

আমি এটা কিভাবে করবো?


আমার মতে আপনি override key_code==back_key_pressআপনার দ্বিতীয় খণ্ডে চেষ্টা করতে পারেন
নিতিন মিশরা

আমি নিজেকে ভালভাবে ব্যাখ্যা করছি না। আমি চাই যে যখন খণ্ডের অদলবদল করা হবে তখন পুরানো টুকরাটি বাম দিকে স্লাইড হবে এবং ডান দিক থেকে নতুন টুকরা প্রবেশ করবে। সেই
কোডটির সাথে

1
এখানে উত্তর দেওয়া হয়েছে: স্ট্যাকওভারফ্লো.com
কার্স্টেন

উত্তর:


276

অ্যান্ড্রয়েড ভি 19 এর জন্য আপডেট করুন + সান্দ্রার মাধ্যমে এই লিঙ্কটি দেখুন

আপনি নিজের অ্যানিমেশন তৈরি করতে পারেন। এনিমেশন এক্সএমএল ফাইলগুলি এতে রাখুনres > anim

enter_from_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
  <translate 
      android:fromXDelta="-100%p" android:toXDelta="0%"
      android:fromYDelta="0%" android:toYDelta="0%"
      android:duration="@android:integer/config_mediumAnimTime"/>
</set>

enter_from_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
  <translate
     android:fromXDelta="100%p" android:toXDelta="0%"
     android:fromYDelta="0%" android:toYDelta="0%"
     android:duration="@android:integer/config_mediumAnimTime" />
</set>

exit_to_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
  <translate 
      android:fromXDelta="0%" android:toXDelta="-100%p"
      android:fromYDelta="0%" android:toYDelta="0%"
      android:duration="@android:integer/config_mediumAnimTime"/>
</set>

exit_to_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
  <translate
     android:fromXDelta="0%" android:toXDelta="100%p"
     android:fromYDelta="0%" android:toYDelta="0%"
     android:duration="@android:integer/config_mediumAnimTime" />
</set>

আপনি সময়কালটি সংক্ষিপ্ত অ্যানিমেশন সময়ে পরিবর্তন করতে পারেন

android:duration="@android:integer/config_shortAnimTime"

বা দীর্ঘ অ্যানিমেশন সময়

android:duration="@android:integer/config_longAnimTime" 

ব্যবহার (নোটের বিষয়ে যে পদ্ধতিতে আপনি কলগুলি পদ্ধতিগুলি কল করুন তা দ্রষ্টব্য। দ্রষ্টব্য you

FragmentTransaction transaction = supportFragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right);
transaction.replace(R.id.content_frame, fragment);
transaction.addToBackStack(null);
transaction.commit();

29
খণ্ডগুলি প্রতিস্থাপন করার সময় কেবলমাত্র এই এক্সএমএল অ্যানিমেশনগুলি ব্যবহার করুন, যেমন: ফ্রেগমেন্টট্রান্সটি.সেট কাস্টম অ্যানিমেশনস (আর। ফ্র্যাগমেন্টট্রান্সঅ্যাকশন.রেপ্লেস (আর। আইডি। কনটেন্ট_ফ্রেম, ট্রেগডেটরিসরসা); fragmentTransaction.addToBackStack (নাল); fragmentTransaction.commit ();
মোন্ড্রয়েড

11
এটির অজানা অ্যানিমেটারের নাম: অনুবাদ করুন
হিরাক ছাতবর

9
এটি কাজ করে না ... কারণ "java.lang.RuntimeException: অজানা অ্যানিমেটার নাম: অনুবাদ করুন"। এই সমাধানটি আমার পক্ষে কাজ করেছিল। trickyandroid.com/fragments-translate-animation
Ataru

27
700আমার মতে এই জাতীয় অ্যানিমেশনগুলির জন্য সময়কাল খানিকটা বেশি। অ্যান্ড্রয়েড ফ্রেমওয়ার্ক সময়জ্ঞান জন্য 3 প্রিসেট রয়েছে: android:duration="@android:integer/config_longAnimTime", android:duration="@android:integer/config_mediumAnimTime"এবং android:duration="@android:integer/config_shortAnimTime", যা 500, 400 এবং 200 সাথে সঙ্গতিপূর্ণ আমি ইউনিট মিলিসেকেন্ড, কিন্তু আমি নিশ্চিত নই।
Krøllebølle

6
শুধুমাত্র সমর্থন টুকরা (android.support.v4.app.Fraament) ব্যবহার করার সময় কাজ করে
আভিভ বেন শাবাত

37

খণ্ডে অ্যানিমেশন লেনদেনের তিনটি উপায় আছে।

স্থানান্তর

সুতরাং অন্তর্নির্মিত ট্রান্সশিশনের একটি ব্যবহার করতে হবে, সেট ট্রান্সশন () পদ্ধতিটি ব্যবহার করুন:

getSupportFragmentManager()
        .beginTransaction()
        .setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN )
        .show( m_topFragment )
        .commit()

কাস্টম অ্যানিমেশন

আপনি setCustomAnimations () পদ্ধতিটি ব্যবহার করে অ্যানিমেশনটি কাস্টমাইজ করতে পারেন:

getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations( R.anim.slide_up, 0, 0, R.anim.slide_down)
        .show( m_topFragment )
        .commit()

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:propertyName="translationY"
        android:valueType="floatType"
        android:valueFrom="1280"
        android:valueTo="0"
        android:duration="@android:integer/config_mediumAnimTime"/>

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:propertyName="translationY"
        android:valueType="floatType"
        android:valueFrom="0"
        android:valueTo="1280"
        android:duration="@android:integer/config_mediumAnimTime"/>

একাধিক অ্যানিমেশন

শেষ অবধি, একক লেনদেনে একাধিক টুকরা অ্যানিমেশনগুলি কিক-অফ করাও সম্ভব। এটি একটি দুর্দান্ত শীতল প্রভাবের জন্য অনুমতি দেয় যেখানে এক টুকরো টুকরো টুকরো হয়ে ওঠে এবং অন্য সময় একই সাথে স্লাইডগুলি নিচে পড়ে:

getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations( R.anim.abc_slide_in_top, R.anim.abc_slide_out_top ) // Top Fragment Animation
        .show( m_topFragment )
        .setCustomAnimations( R.anim.abc_slide_in_bottom, R.anim.abc_slide_out_bottom ) // Bottom Fragment Animation
        .show( m_bottomFragment )
        .commit()

আরও বিশদে আপনি URL টি দেখতে পারেন

দ্রষ্টব্য: - আপনি আপনার প্রয়োজনীয়তা অনুসারে অ্যানিমেশনটি পরীক্ষা করতে পারেন কারণ উপরে সমস্যা হতে পারে।


1
আপনি নিখুঁত হার্ড-কোডেড মান ব্যবহার করছেন। পূর্ববর্তী খণ্ডটি উচ্চতর রেজোলিউশন প্রদর্শনের জন্য পর্দার মাঝখানে অদৃশ্য হয়ে যাবে।
TheLibrarian

@ দ্য লাইব্রেরিয়ানসিজেড এটির উদাহরণ
Duggu

1
এটি হয় এবং তা হয় না।
TheLibrarian

এটি নির্ভর করে যে কেউ কেউ উপরের উদাহরণ থেকে চামচ খাওয়ানো বা উদাহরণের সাথে তারা কী অর্জন করতে পারে সে বিষয়ে শিক্ষা গ্রহণ করতে চায়।
duggu

এম_টপফ্রেগমেন্ট ভেরিয়েবলটিতে কী রয়েছে
প্রিন্স

6

আমার একই সমস্যা আছে, আমি সহজ সমাধান ব্যবহার করেছি

1) আনম ফোল্ডারে স্লাইডিং_আউট_টাইট.এক্সএমএল তৈরি করুন

  <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="0" android:toXDelta="-50%p"
            android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
            android:duration="@android:integer/config_mediumAnimTime" />
    </set>

2) এনিম ফোল্ডারে স্লাইডিং_ইন_ফিট.এক্সএমএল তৈরি করুন

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

৩) অ্যানিমেশনের জন্য দুটি কাস্টম এক্সএমএল এবং দুটি ডিফল্ট এক্সএমএল সহ কেবল খণ্ড লেনদেন সেটসাস্টম অ্যানিমেশন () ব্যবহার করুন: -

 fragmentTransaction.setCustomAnimations(R.anim.sliding_in_left, R.anim.sliding_out_right, android.R.anim.slide_in_left, android.R.anim.slide_out_right );

5

slide_in_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="0%p"
        android:toYDelta="100%p" />
</set>

slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="100%p"
        android:toYDelta="0%p" />
</set>

slide_out_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="-100%"
        android:toYDelta="0"
        />
</set>

slide_out_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="0%p"
        android:toYDelta="-100%p"
        />
</set>

দিক = নিচে

            activity.getSupportFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.anim.slide_out_down, R.anim.slide_in_down)
                    .replace(R.id.container, new CardFrontFragment())
                    .commit();

দিক = উপরে

           activity.getSupportFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up)
                    .replace(R.id.container, new CardFrontFragment())
                    .commit();

2

এটি অন্য একটি সমাধান যা আমি ব্যবহার করি:

public class CustomAnimator {
    private static final String TAG = "com.example.CustomAnimator";

    private static Stack<AnimationEntry> animation_stack    = new Stack<>();

    public static final int                 DIRECTION_LEFT  = 1;
    public static final int                 DIRECTION_RIGHT = -1;
    public static final int                 DIRECTION_UP    = 2;
    public static final int                 DIRECTION_DOWN  = -2;

    static class AnimationEntry {
        View in;
        View    out;
        int     direction;
        long    duration;
    }

    public static boolean hasHistory() {
        return !animation_stack.empty();
    }

    public static void reversePrevious() {
        if (!animation_stack.empty()) {
            AnimationEntry entry = animation_stack.pop();
            slide(entry.out, entry.in, -entry.direction, entry.duration, false);
        }
    }

    public static void clearHistory() {
        animation_stack.clear();
    }

    public static void slide(final View in, View out, final int direction, long duration) {
        slide(in, out, direction, duration, true);
    }

    private static void slide(final View in, final View out, final int direction, final long duration, final boolean save) {

        ViewGroup in_parent = (ViewGroup) in.getParent();
        ViewGroup out_parent = (ViewGroup) out.getParent();

        if (!in_parent.equals(out_parent)) {
            return;
        }

        int parent_width = in_parent.getWidth();
        int parent_height = in_parent.getHeight();

        ObjectAnimator slide_out;
        ObjectAnimator slide_in;

        switch (direction) {
            case DIRECTION_LEFT:
            default:
                slide_in = ObjectAnimator.ofFloat(in, "translationX", parent_width, 0);
                slide_out = ObjectAnimator.ofFloat(out, "translationX", 0, -out.getWidth());
                break;
            case DIRECTION_RIGHT:
                slide_in = ObjectAnimator.ofFloat(in, "translationX", -out.getWidth(), 0);
                slide_out = ObjectAnimator.ofFloat(out, "translationX", 0, parent_width);
                break;
            case DIRECTION_UP:
                slide_in = ObjectAnimator.ofFloat(in, "translationY", parent_height, 0);
                slide_out = ObjectAnimator.ofFloat(out, "translationY", 0, -out.getHeight());
                break;
            case DIRECTION_DOWN:
                slide_in = ObjectAnimator.ofFloat(in, "translationY", -out.getHeight(), 0);
                slide_out = ObjectAnimator.ofFloat(out, "translationY", 0, parent_height);
                break;
        }

        AnimatorSet animations = new AnimatorSet();
        animations.setDuration(duration);
        animations.playTogether(slide_in, slide_out);
        animations.addListener(new Animator.AnimatorListener() {

            @Override
            public void onAnimationCancel(Animator arg0) {
            }

            @Override
            public void onAnimationEnd(Animator arg0) {
                out.setVisibility(View.INVISIBLE);
                if (save) {
                    AnimationEntry ae = new AnimationEntry();
                    ae.in = in;
                    ae.out = out;
                    ae.direction = direction;
                    ae.duration = duration;
                    animation_stack.push(ae);
                }
            }

            @Override
            public void onAnimationRepeat(Animator arg0) {
            }

            @Override
            public void onAnimationStart(Animator arg0) {
                in.setVisibility(View.VISIBLE);
            }
        });
        animations.start();
    }
}

ক্লাস ব্যবহার। আসুন আমরা নীচে দেখানো হিসাবে দুটি টুকরা (তালিকা এবং বিশদ বিবরণ টুকরা) আছে বলে যাক

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ui_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

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

    <FrameLayout
        android:id="@+id/details_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />
</FrameLayout>

ব্যবহার

View details_container = findViewById(R.id.details_container);
View list_container = findViewById(R.id.list_container);
// You can select the direction left/right/up/down and the duration
CustomAnimator.slide(list_container, details_container,CustomAnimator.DIRECTION_LEFT, 400);

CustomAnimator.reversePrevious();ব্যবহারকারীর পিছনে চাপলে আপনি পূর্ববর্তী ভিউটি পেতে ফাংশনটি ব্যবহার করতে পারেন ।


1
আপনি কি অ্যান্ড্রয়েডের খণ্ডগুলি ব্যবহার করছেন তা নিশ্চিত? =) কাস্টম টুকরা-পরিচালনা ভিউ-ভিত্তিক সিস্টেমটি ব্যবহার করার মতো বলে মনে হচ্ছে)
চুম্বন করেছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.