বিন্দু থেকে অ্যানিমেশন বাড়ার সাথে ডায়ালগফ্রেগমেন্ট দেখান


94

আমি DialogFragmentযখন একটিতে একটি ব্যবহারকারীকে একটি সারিতে টোকা দিচ্ছি তখন আমি তা প্রদর্শন করছি ListView। আমি ডায়লগটির প্রদর্শনটি প্রাণবন্ত করতে চাই যাতে এটি সারিটির কেন্দ্র থেকে বৃদ্ধি পায়। লঞ্চার থেকে কোনও ফোল্ডার খোলার সময় একইরকম প্রভাব দেখা যায়।

একটি ধারণা যা আমার ছিল তা হ'ল TranslateAnimationএবং এর সংমিশ্রণ ScaleAnimation। অন্য উপায় আছে?


4
পড়ুন লিংক DialogFragment উপর অ্যানিমেশন জন্য।
এএসএইচ

উত্তর:


171

হচ্ছে DialogFragmentএকটি মোড়কের Dialogবর্গ, আপনি আপনার বেস একটি থিম সেট করা উচিত Dialogঅ্যানিমেশন আপনি চান পেতে:

public class CustomDialogFragment extends DialogFragment implements OnEditorActionListener
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    {
        // Set a theme on the dialog builder constructor!
        AlertDialog.Builder builder = 
            new AlertDialog.Builder( getActivity(), R.style.MyCustomTheme );

        builder  
        .setTitle( "Your title" )
        .setMessage( "Your message" )
        .setPositiveButton( "OK" , new DialogInterface.OnClickListener() 
            {      
              @Override
              public void onClick(DialogInterface dialog, int which) {
              dismiss();                  
            }
        });
        return builder.create();
    }
}

তারপরে আপনাকে কেবল থিমটি সংজ্ঞায়িত করতে হবে যা আপনার পছন্দসই অ্যানিমেশনটি অন্তর্ভুক্ত করবে। ইন styles.xml আপনার কাস্টম থিম যোগ করুন:

<style name="MyCustomTheme" parent="@android:style/Theme.Panel">
    <item name="android:windowAnimationStyle">@style/MyAnimation.Window</item>
</style>

<style name="MyAnimation.Window" parent="@android:style/Animation.Activity"> 
    <item name="android:windowEnterAnimation">@anim/anim_in</item>
    <item name="android:windowExitAnimation">@anim/anim_out</item>
</style>    

এখন রেজ / আনিম ফোল্ডারে অ্যানিমেশন ফাইলগুলি যুক্ত করুন :

( android:pivotYমূল কী)

anim_in.xML

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/linear_interpolator"
        android:fromXScale="0.0"
        android:toXScale="1.0"
        android:fromYScale="0.0"
        android:toYScale="1.0"
        android:fillAfter="false"
        android:startOffset="200"
        android:duration="200" 
        android:pivotX = "50%"
        android:pivotY = "-90%"
    />
    <translate
        android:fromYDelta="50%"
        android:toYDelta="0"
        android:startOffset="200"
        android:duration="200"
    />
</set>

anim_out.xML

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/linear_interpolator"
        android:fromXScale="1.0"
        android:toXScale="0.0"
        android:fromYScale="1.0"
        android:toYScale="0.0"
        android:fillAfter="false"
        android:duration="200" 
        android:pivotX = "50%"        
        android:pivotY = "-90%"        
    />
    <translate
        android:fromYDelta="0"
        android:toYDelta="50%"
        android:duration="200"
    />
</set>

অবশেষে, এখানে জটিল জিনিসটি হ'ল প্রতিটি সারিটির কেন্দ্র থেকে আপনার অ্যানিমেশনটি বাড়ানো। আমি মনে করি সারিটি স্ক্রিনটি অনুভূমিকভাবে পূরণ করছে, একদিকে android:pivotXমান স্থির থাকবে। অন্যদিকে, আপনি এটিকে সংশোধন করতে পারবেন নাandroid:pivotY প্রোগ্রামটিভ্যালি মানটি ।

আমার পরামর্শটি হ'ল, আপনি কয়েকটি অ্যানিমেশন নির্দিষ্ট করে নিন যার প্রতিটিটির বৈশিষ্ট্যে আলাদা শতাংশের মান রয়েছে android:pivotY(এবং বেশ কয়েকটি থিম সেই অ্যানিমেশনগুলিকে উল্লেখ করে)। তারপরে, যখন ব্যবহারকারীটি সারিটি টোকা দেয়, তখন স্ক্রিনের সারিটির শতাংশে Y অবস্থান নির্ণয় করুন। শতাংশে অবস্থানটি জানা, আপনার ডায়লগে একটি থিম বরাদ্দ করুন যা উপযুক্তandroid:pivotY মান।

এটি একটি নিখুঁত সমাধান নয় তবে আপনার জন্য কৌশলটি করতে পারে। আপনি যদি ফলাফলটি পছন্দ না করেন তবে আমি DialogFragmentএকটি সাধারণটিকে ভুলে যাওয়া এবং অ্যানিমেট করার পরামর্শ দেবView সারিটির সঠিক কেন্দ্র থেকে ।

শুভকামনা!


স্ক্রিনে বিভিন্ন অবস্থানের জন্য একাধিক অ্যানিমেশন সহ ভাল ধারণা। এটি হ্যাক, তবে এটি একমাত্র উপায় বলে মনে হচ্ছে।
এডওয়ার্ড ডেল

এটি কেবল> এপিআই ১১ @ কিরণ বাবুর উত্তর নিয়ে কাজ করবে
ব্লুন্ডেল

আপনি কি জানেন যে এই অ্যানিমেশনগুলি সম্পন্ন হওয়ার পরে কলব্যাক পাওয়ার কোনও সম্ভাব্য উপায় আছে কিনা? আমি একটি 2-অংশ অ্যানিমেশন করতে চাই, যেখানে ডায়লগটি স্লাইড হয় এবং তারপরে দৃশ্যের বিবর্ণ হয় I উইন্ডো অ্যানিমেশনগুলিতে আমি কীভাবে শ্রোতার সাথে যোগাযোগ করব?
android_student

ক্ষিপ্ত! আমি যে সন্ধান করেছি তা স্পষ্টই!
আলেক্সে টিমোশচেঙ্কো

4
সেট থিম করছেন হিসাবে সহজ হিসাবে হতে পারে setStyle(DialogFragment.STYLE_NORMAL, R.style.MyCustomTheme)উপর onCreate(bundle): দেখুন developer.android.com/reference/android/app/DialogFragment.html
tropicalfish

121

এই কোডটি এটি পরীক্ষা করে দেখুন, এটি আমার পক্ষে কাজ করে

// স্লাইড আপ অ্যানিমেশন

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="100%"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="0" />

</set>

// স্লাইড ডোম অ্যানিমেশন

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="0%p"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toYDelta="100%p" />

</set>

// স্টাইল

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

// ডায়ালগ খণ্ডের ভিতরে

@Override
public void onActivityCreated(Bundle arg0) {
    super.onActivityCreated(arg0);
    getDialog().getWindow()
    .getAttributes().windowAnimations = R.style.DialogAnimation;
}

8
দুঃখিত, এটি আমার প্রশ্নের মোটেই উত্তর দেয় না।
এডওয়ার্ড ডেল

4
এটি ওপি যা চাইছে ঠিক তা নাও হতে পারে তবে এটি একটি ভাল এন্ট্রি পয়েন্ট বলে আমি মনে করি।
mdelolmo

4
দুর্দান্ত উদাহরণ! একমাত্র নমুনা যা আমার পক্ষে কাজ করেছিল। ট্রিকটি অ্যাক্টিভিটি ক্রিয়েটেড (...) পদ্ধতিতে অ্যানিমেশন / থিম সেট করতে হবে
tomurka

4
এটি কার্যকর হতে পারে তবে এটি প্রশ্নের কোনও উত্তর দেয় না।
ওলেইঙ্কা

আপনি কি জানেন যে এই অ্যানিমেশনগুলি সম্পন্ন হওয়ার পরে কলব্যাক পাওয়ার কোনও সম্ভাব্য উপায় আছে কিনা? আমি একটি 2-অংশ অ্যানিমেশন করতে চাই, যেখানে ডায়লগটি স্লাইড হয় এবং তারপরে দৃশ্যের বিবর্ণ হয় I উইন্ডো অ্যানিমেশনগুলিতে আমি কীভাবে শ্রোতার সাথে যোগাযোগ করব?
android_student

22

ডায়ালগফ্রেগমেন্টের একটি সর্বজনীন getTheme () পদ্ধতি রয়েছে যা আপনি এই সঠিক কারণে চালাতে পারেন। এই সমাধানটি কোডের কম লাইন ব্যবহার করে:

public class MyCustomDialogFragment extends DialogFragment{
    ...
    @Override
    public int getTheme() {
        return R.style.MyThemeWithCustomAnimation;
    }
}

4
কোনও উদ্বেগের দরকার নেই ... সহজ এবং সরল সমাধান।
নওন্ডলা সন্দীপ

এটি আমার পক্ষে সেরা উত্তর!
সুপারউজার

মূল প্রশ্নের সাথে সম্পর্কিত না হওয়ার সাথে সাথে আমার মেইনএকসিটিভিটিতে একটি গ্যালারী প্রদর্শিত হয়েছিল যেখানে ব্যবহারকারী ক্লিক ডায়ালগফ্রেগমেন্টের স্লাইডশোটি সক্রিয় করবে। স্লাইডশো থেকে যখনই ফিরে আসুক মেইনএ্যাকটিভিটিতে একটি বিড়ম্বনা রয়েছে। AppTheme.NoActionBarডায়ালগফ্র্যাগমেন্টটি ডিফল্ট ব্যবহার করার সময় এটি মেইনএ্যাকটিভিটির কারণে হয়েছে AppTheme। উপরের পদ্ধতিটি খণ্ড এবং ক্রিয়াকলাপ উভয় ক্ষেত্রেই ধারাবাহিক থিম রেখে আমার সমস্যার সমাধান করেছে।
tingyik90

ব্রো, আপনি প্রতিভা
জ্যাকি চং

এই সমাধানটি আমার পক্ষে কাজ করেছিল। তবে একটা জিনিস আমাকে বিভ্রান্ত করেছে; উইন্ডোএন্টিএনিমেশন বা উইন্ডোএক্সিটএনিমেশনটি সরাসরি থিমে সেট করা আমার ডায়ালগফ্রেগমেন্টস অ্যানিমেশনগুলিতে কোনও পার্থক্য আনবে না। আমার পক্ষে কাজ করা একমাত্র কাজটি ছিল উইন্ডোএনিমেশনস্টাইলকে একটি পৃথক এক্সএমএল ফাইলে সেট করা যা স্টাইলটি সংজ্ঞায়িত করে সেখানে প্রবেশ এবং প্রস্থান অ্যানিমেশনগুলি সেট করে
szaske

10

অ্যানিমেশন সহ একটি পূর্ণ-স্ক্রিন কথোপকথন পেতে, নিম্নলিখিতটি লিখুন ...

শৈলী:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionModeBackground">?attr/colorPrimary</item>
    <item name="windowActionModeOverlay">true</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.NoActionBar.FullScreenDialog">
    <item name="android:windowAnimationStyle">@style/Animation.WindowSlideUpDown</item>
</style>

<style name="Animation.WindowSlideUpDown" parent="@android:style/Animation.Activity">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

res / anim / slide_up.xML

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="@android:interpolator/accelerate_quad">

    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromYDelta="100%"
        android:toYDelta="0%"/>
</set>

res / anim / slide_down.xML

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="@android:interpolator/accelerate_quad">

    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromYDelta="0%"
        android:toYDelta="100%"/>
</set>

জাভা কোড:

public class MyDialog extends DialogFragment {

    @Override
    public int getTheme() {
        return R.style.AppTheme_NoActionBar_FullScreenDialog;
    }
}

private void showDialog() {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    Fragment previous = getSupportFragmentManager().findFragmentByTag(MyDialog.class.getName());
    if (previous != null) {
        fragmentTransaction.remove(previous);
    }
    fragmentTransaction.addToBackStack(null);

    MyDialog dialog = new MyDialog();
    dialog.show(fragmentTransaction, MyDialog.class.getName());
}

4

আপনার ডায়লগ খণ্ডে অন স্টার্টের অভ্যন্তরে সজ্জা দর্শন ব্যবহার করুন

@Override
public void onStart() {
    super.onStart();


    final View decorView = getDialog()
            .getWindow()
            .getDecorView();

    decorView.animate().translationY(-100)
            .setStartDelay(300)
            .setDuration(300)
            .start();

}

4
অন্তর্নিহিত দৃশ্যটি পরে ক্লিকযোগ্য হবে বলে মনে হচ্ছে না
হেইডেনকাই

3

ডায়ালগফ্রেগমেন্টে, কাস্টম অ্যানিমেশনটিকে onCreateDialog বলা হয়। 'ডায়ালগএনিমেশন' পূর্বের উত্তরের কাস্টম অ্যানিমেশন স্টাইল।

public Dialog onCreateDialog(Bundle savedInstanceState) 
{
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
    return dialog;
}

1

জুমিং ভিউয়ের বিষয়ে আপনি কি অ্যান্ড্রয়েড বিকাশকারী প্রশিক্ষণ দেখেছেন? ? একটি ভাল সূচনা পয়েন্ট হতে পারে।

আপনি সম্ভবত একটি কাস্টম ক্লাস প্রসারিত তৈরি করতে চান DialogFragment এই কাজ পেতে ।

এছাড়াও, মধুসংক্রান্ত অ্যানিমেশন এপিআই সামঞ্জস্যতার জন্য জ্যাক ওয়ার্টন নাইনওল্ডএন্ড্রয়েডস একবার এআইপি লেভেল 1-এ ফিরে দেখুন।


1

আপনি যদি API গুলির উপর কাজ করতে চান তবে আপনাকে নিজের ডায়ালগফ্রেজেন্ট-> অন স্টার্টের ভিতরে করতে হবে এবং অনক্রিটডায়ালগের ভিতরে নয়

@Override
    public void onStart() 
    {
        if (getDialog() == null) 
        {
            return;
        }

        getDialog().getWindow().setWindowAnimations(
                  R.style.DlgAnimation);

        super.onStart();
    }

আমার মতে সেরা সমাধান। এটি সতর্কতা ডায়ালগগুলির জন্যও কাজ করে, এটি কেবলমাত্র অনলাইনে তালিকাতে ব্যবহার করুন। ধন্যবাদ!
গ্যাবর নোভাক

0

এই কোডটি মানগুলিতে যুক্ত করুন

 <scale
    android:duration="@android:integer/config_longAnimTime"
    android:fromXScale="0.2"
    android:fromYScale="0.2"
    android:toXScale="1.0"
    android:toYScale="1.0"
    android:pivotX="50%"
    android:pivotY="50%"/>
<alpha
    android:fromAlpha="0.1"
    android:toAlpha="1.0"
    android:duration="@android:integer/config_longAnimTime"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>

স্টাইল.এক্সএমএলে কল করুন

<style name="DialogScale">
    <item name="android:windowEnterAnimation">@anim/scale_in</item>
    <item name="android:windowExitAnimation">@anim/scale_out</item>
</style>

জাভা কোডে: অনক্লিক সেট করুন

public void onClick(View v) {
        fab_onclick(R.style.DialogScale, "Scale" ,(Activity) context,getWindow().getDecorView().getRootView());
      //  Dialogs.fab_onclick(R.style.DialogScale, "Scale");

    }

পদ্ধতিতে সেটআপ:

alertDialog.getWindow().getAttributes().windowAnimations = type;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.