খণ্ডগুলির মধ্যে রূপান্তর সঞ্চার করুন


284

আমি টুকরাগুলির মধ্যে রূপান্তর সক্রিয় করার চেষ্টা করছি। আমি নিম্নলিখিত অ্যান্ড্রয়েড টুকরা এবং অ্যানিমেশন থেকে উত্তর পেয়েছি

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

এবং আমার আর.আনিম.স্লাইড_ইন_ বাম

<?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>

কিন্তু যখন আমি এটি চেষ্টা করেছিলাম তখন এটি প্রদর্শিত হয়েছিল

02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)

কোন ধারনা? যখন আমি পরীক্ষা করেছি হানিকম্ব এপিআই রেফারেন্সটি translateআছে। আমি কি থেকে বাতিল হলাম?
টুকরাগুলির মধ্যে রূপান্তর সঞ্চার করার জন্য কি অন্য কোনও উপায় আছে? ধন্যবাদ


অ্যানিমেটর ব্যবহার করুন --- অ্যানিমেশন নয়! ব্যবহারের android.R.ANIMATOR.fade_in, কাজ করে android.R.ANIM.fade_in ব্যবহার করবেন না - এটি আচরণ বাগ রয়েছে
user1269737

উত্তর:


347

আপনি নতুন ব্যবহার করতে হবে android.animationসঙ্গে ফ্রেমওয়ার্ক (বস্তুর অ্যানিমেটরবৃন্দ) FragmentTransaction.setCustomAnimationsসেইসাথে FragmentTransaction.setTransition

setCustomAnimationsএপিডেমোসের ফ্রেগমেন্টহাইডশো.জভা থেকে ব্যবহার করার জন্য এখানে একটি উদাহরণ রয়েছে :

ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

এবং এখানে রেস / অ্যানিমেটার / ফেইড_ইন.এমএমএল থেকে প্রাসঙ্গিক অ্যানিমেটার এক্সএমএল :

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/accelerate_quad"
    android:valueFrom="0"
    android:valueTo="1"
    android:propertyName="alpha"
    android:duration="@android:integer/config_mediumAnimTime" />

মনে রাখবেন যে আপনি <set>পুরানো অ্যানিমেশন কাঠামোর সাথে যেমন ব্যবহার করতে পারেন তেমন একাধিক অ্যানিমেটর ব্যবহার করে একত্রিত করতে পারেন ।


সম্পাদনা : যেহেতু লোকেরা স্লাইড-ইন / স্লাইড-আউট সম্পর্কে জিজ্ঞাসা করছে, আমি এখানে সে সম্পর্কে মন্তব্য করব।

স্লাইড-ইন এবং স্লাইড-আউট

আপনি অবশ্যই সজীব করতে translationX, translationY, x, এবং yসম্পত্তি, কিন্তু সাধারণভাবে স্লাইডে এবং অফ-স্ক্রিন থেকে বিষয়বস্তু অ্যানিমেট করা জড়িত। আমি যতদূর জানি এমন কোনও রূপান্তর বৈশিষ্ট্য নেই যা আপেক্ষিক মান ব্যবহার করে। যাইহোক, এটি আপনাকে সেগুলি নিজে লিখতে বাধা দেয় না। মনে রাখবেন যে সম্পত্তি অ্যানিমেশনগুলিতে আপনি অ্যানিমেশন করছেন এমন বস্তুর উপর কেবল গেটর এবং সেটার পদ্ধতি প্রয়োজন (এই ক্ষেত্রে দেখা হয়েছে), যাতে আপনি কেবল নিজের ভিউ সাবক্লাসে নিজেরgetXFraction এবং setXFractionপদ্ধতিগুলি তৈরি করতে পারেন , যেমন:

public class MyFrameLayout extends FrameLayout {
    ...
    public float getXFraction() {
        return getX() / getWidth(); // TODO: guard divide-by-zero
    }

    public void setXFraction(float xFraction) {
        // TODO: cache width
        final int width = getWidth();
        setX((width > 0) ? (xFraction * width) : -9999);
    }
    ...
}

এখন আপনি 'এক্সফ্রাকশন' বৈশিষ্ট্যটি এনিমেট করতে পারেন:

পুনরায় / অ্যানিমেটার / স্লাইড_ইন.এমএমএল :

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:valueFrom="-1.0"
    android:valueTo="0"
    android:propertyName="xFraction"
    android:duration="@android:integer/config_mediumAnimTime" />

মনে রাখবেন যে বস্তুটিতে আপনি অ্যানিম্যাট করছেন সেটি যদি তার পিতামাতার মতো প্রস্থের মতো না হয় তবে জিনিসগুলি বেশ ঠিক দেখাচ্ছে না, তাই আপনার ব্যবহারের ক্ষেত্রে উপযুক্ত হতে পারে আপনার সম্পত্তি বাস্তবায়নটিকে টুইঙ্ক করতে হবে।


8
আমি ফেইড_ইন এবং ফিড_আউটকে কাজ করতে পেয়েছি, কিন্তু অন্যদের মধ্যে / রেজুলেশন / অ্যানিমেটার ত্রুটি দেয়। এমনকি এগুলির কোনওটিই স্লাইডিং এবং স্লাইডিংয়ের জন্য বলে মনে হচ্ছে না। আমি এটি করার জন্য আমার নিজের এক্সএমএল লেখার চেষ্টা করেছি, তবে আমি শেষ পর্যন্ত সমস্ত টুকরো টুকরো টুকরো টুকরো টুকরো। দয়া করে আরও কিছু সাহায্য করবেন?
ডেভ ম্যাকলিন

এবং অনুবাদ সম্পর্কে কি? এক্সএমএলে অ্যানিমেটর সংজ্ঞায়িত কোন বস্তুর শতাংশের মান সহ আপনি কীভাবে অনুবাদ করবেন? এক্সএমএলে উল্লম্ব স্লাইড অ্যানিমেশন সংজ্ঞায়িত করে
উল্টানোর সময় আমি অ্যাডাপ্টারভিউ ফ্লিপার সঞ্চারিত

6
আমি 11-19 10: 27: 50.912: ডাব্লু / প্রোপার্টিভ্যালুহোল্ডার (23107): টার্গেট ক্লাস অ্যান্ড্রয়েড.উইজেট.ফ্রেমলআউটটিতে টাইপ ফ্লোট সহ মেথড সেট এক্সফ্রাকশন () পাইনি। তবে আমার এক্সএমএলে আমার কাস্টম ভিউ মাইফ্রেমলআউট আছে। কোন ধারনা?
বার্কসাইড

13
প্রকৃতপক্ষে, রোমান, পরামর্শটি অন্যভাবেও চলতে হবে: সমর্থন লাইব্রেরিটি ব্যবহার করার সময়, আপনাকে ফ্রেগমেন্ট
ট্রানসেকশন.সেট কাস্টম

1
@ রোমাননুরিক এই উত্তরটি বেশিরভাগ ডিভাইসে দুর্দান্ত কাজ করেছে, তবে কিছু ব্যবহারকারীর জন্য (বিশেষত কিছু স্যামসাং গ্যালাক্সি এস 3/4 ফোনে) অ্যানিমেশন চলাকালীন কোনও কারণে প্রস্থটি প্রকাশিত হচ্ছে না, যার ফলে খণ্ডটি কখনই প্রদর্শিত হবে না। আমি এখানে প্রদর্শিত হিসাবে একটি অনপ্রেড্রাওলিস্টনার ব্যবহার করে তাদের ব্যবহারকারীর পক্ষে এটি করতে সক্ষম হয়েছি: mavyasoni9891.blogspot.com/2014/06/…
আজপল্ট

188

আমি এইভাবে করেছি:

অ্যানিমেশন সহ খণ্ডগুলি প্রতিস্থাপন করতে এই পদ্ধতিটি যুক্ত করুন :

public void replaceFragmentWithAnimation(android.support.v4.app.Fragment fragment, String tag){
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left);
    transaction.replace(R.id.fragment_container, fragment);
    transaction.addToBackStack(tag);
    transaction.commit();
}

যা শুরু করেছো যোগ চার অ্যানিমেশন মধ্যে 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%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

প্রস্থান_ থেকে_রাইট.এক্সএমএল :

<?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%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</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%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

প্রস্থান_ টু_ লেফট.এক্সএমএল :

<?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%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন

তার কাজ শেষ হয়েছে


14
দুর্দান্ত সমাধান। তবে আপনি কেন আরটিএল-এ দিকনির্দেশ পরিবর্তন করেছেন তা আমি নিশ্চিত নই। আমার পদ্ধতি:.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right)
জেড

2
দুর্দান্ত সমাধান। ক্রিয়াকলাপগুলির মধ্যে রূপান্তরের জন্য অনুরূপ পদ্ধতি এবং একই অ্যানিমেশন ফাইলগুলি কাজ করে।
স্টান

1
@ মাইকজ্রিয়েল, পুনরায় -> আনিম -> আপনার এক্সএমএলটি এখানে রাখুন
হিরেন প্যাটেল

3
ধন্যবাদ হিরেন, আমি গতি (700) থেকে (300) এ আরও ভাল এবং আইওএসের মতো আরও পরিবর্তন করি
মাইক জ্রিয়েল

3
LOL, আমি সমাধান নিয়ে ফিরে এসেছি। আমি প্রতিটি জাভা ক্লাসে অ্যান্ড্রয়েড.এপ.ফ্রেগমেন্ট এবং ফ্র্যাগমেন্টম্যানেজার আমদানি করছিলাম। কিছু উপকরণ চেক করার পরে, আমি খুঁজে পেয়েছি যে 'setCustomAnimations ()' ব্যবহার করে android.support.v4 লাইব্রেরি আমদানি করা দরকার। এটি 'সমর্থন.v4.app' হওয়া উচিত বলে গুরুত্বপূর্ণ! আমি 'getFragmentManager ()' এর সমস্ত পদ্ধতি 'getSupportFraamentManager ()' এর সাথে প্রতিস্থাপন করেছি, এবং সমস্ত আমদানি 'android.app.Fragment / ফ্র্যাগমেন্টম্যানেজার ...' থেকে 'android.support.v4.app ....' এ নিয়েছি, তারপরে এটি অ্যানিমেশনটি ক্র্যাশ ছাড়াই ভাল কাজ শুরু করেছে ... আপনি যদি একইরকম ক্ষেত্রে আটকে থাকেন তবে আমার সমাধানটি পড়ুন।
থেক্স

58

আপনি যদি কেবল ললিপপ এবং তার পরে নিজেকে বেঁধে রাখতে সক্ষম হন তবে এটি কৌশলটি মনে হচ্ছে:

import android.transition.Slide;
import android.util.Log;
import android.view.Gravity;
.
.
.
f = new MyFragment();
f.setEnterTransition(new Slide(Gravity.RIGHT));
f.setExitTransition(new Slide(Gravity.LEFT));
getFragmentManager()
    .beginTransaction()
    .replace(R.id.content, f, FRAG_TAG)  // FRAG_TAG is the tag for your fragment
    .commit();

আশাকরি এটা সাহায্য করবে.


1
যদিও এটি ললিপপে এটি অর্জন করবে, এটি ললিপপ চালিত ডিভাইসের শতকরা হার নগণ্য (বর্তমানে অ্যান্ড্রয়েড ডিভাইসের ১. L% ললিপপ চলছে) it's
ইরান গোল্ডিন

1
new Slide(...): কলটির জন্য
এআইপিএল

getKey () মানে কি?
আলভারো

13
@ ইরানগল্ডিন ​​কিছুই চিরকাল স্থায়ী হয় না .. আপনি আজ কোনও অ্যানড্রয়েড ২.০++ সমাধানের জন্য উপহাস করবেন?
টম

@ টম আপনার একটি পয়েন্ট আছে। তবে যখন আপনার অ্যাপ্লিকেশনটিতে একটি বৃহত ব্যবহারকারীর বেস রয়েছে তবে কেবলমাত্র এপিআই স্তরটি কাটাতে পারে না। যদি আপনার বেশিরভাগ ব্যবহারকারী আপনার পরে আর অ্যাপ্লিকেশন চালাতে না সক্ষম হন তবে এটি কোনও সমাধান নয়।
ইরান গোল্ডিন

47

Nurik এর উত্তর খুব সহায়ক ছিল, কিন্তু আমি যে পর্যন্ত না আমি দেখেছি কাজ বুঝে উঠতে পারতাম না এই । সংক্ষেপে, আপনি যদি সামঞ্জস্যতা গ্রন্থাগারটি ব্যবহার করেন (যেমন ফ্রেগমেন্টম্যানেজারের পরিবর্তে সাপোর্টফ্রেগমেন্টম্যানেজার), এক্সএমএল অ্যানিমেশন ফাইলের বাক্য গঠনটি ভিন্ন হবে।


28

টুকরাগুলির মধ্যে অ্যানিমেশন ভিতরে / আউট স্লাইড এখানে:

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim);
transaction.replace(R.id.listFragment, new YourFragment());
transaction.commit();

আমরা একটি অবজেক্ট অ্যানিমেটার ব্যবহার করছি।

অ্যানিমেটার সাবফোল্ডারে দুটি এক্সএমএল ফাইল এখানে রয়েছে ।

enter_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
     <objectAnimator
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:duration="1000"
         android:propertyName="x"
         android:valueFrom="2000"
         android:valueTo="0"
         android:valueType="floatType" />
</set>

exit_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-2000"
        android:valueType="floatType" />
</set>

আমি আশা করি যে কাউকে সাহায্য করবে।


37
2000 পিক্সের জন্য ভিউ সরিয়ে নেওয়া খুব কুরুচিপূর্ণ সমাধান।
carlo.marinangeli

4
প্রস্থান_আনিমটি কেবল আমার জন্য পর্দা বন্ধ "পপস" করছে, এটি স্ক্রিন জুড়ে ফিরে সঞ্চারিত করে না। কোন ধারনা? আমি ব্যবহার করছি.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right, R.animator.slide_in_left, R.animator.slide_out_right)
মিঃ পাবলো

@ মিপাবলো, কারণ সম্ভবত আপনি উপরের কোডটি পেস্ট করেছেন নি copy setCustomAnimations প্রতিস্থাপন পদ্ধতির আগে কল করা উচিত।
গাল্যা

এই ক্ষেত্রে, যদি আমি অ্যানিমেশন দিয়ে অন্য খণ্ডকে প্রতিস্থাপন করি এবং অ্যানিমেশন সময়-কাল বা সময়ের সাথে সাথে আবার অ্যাপ্লিকেশনটিতে ফিরে আসার আগেই আমি অ্যাপ্লিকেশনটিকে ন্যূনতম করি তবে এটি পূর্ববর্তী খণ্ড এবং বর্তমান খণ্ডের সমান্তরাল প্রদর্শন করবে।
প্রিন্স

23

অন্য যে কেউ ধরা পড়ে তার জন্য, লেনদেন তৈরির সময় প্রতিস্থাপন / যুক্ত করার জন্য কল কাস্টম অ্যানিমেশনগুলি কল করা উচিত তা নিশ্চিত করুন।


12

ফ্রেগমেন্ট ট্রান্সজেকশনের অ্যান্ড্রয়েড এসডিকে বাস্তবায়ন Animatorকিছুক্ষণ সমর্থন লাইব্রেরি চায় Animation, আমাকে জিজ্ঞাসা করবেন না কেন তবে অজল্লুকের মন্তব্যের পরে আমি অ্যান্ড্রয়েড .3.০.৩ কোড এবং সমর্থন লাইব্রেরিতে দেখেছি। অ্যান্ড্রয়েড এসডিকে loadAnimator()গ্রন্থাগার ব্যবহারগুলি সমর্থন করেloadAnimation()


7

এই সহজ এবং দ্রুত সমাধানটি ব্যবহার করে দেখুন। অ্যান্ড্রয়েড কিছু ডিফল্ট animationগুলি সরবরাহ করে।

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

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন


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