স্লাইড আপ / ডাউন অ্যানিমেশন সহ একটি ভিউ দেখান এবং লুকান


318

আমার এমন একটি রয়েছে LinearLayoutযা আমি Animationযখনই এর দৃশ্যমানতাটি পরিবর্তন করি তখন লেআউটটিকে উপরে বা নীচে দিকে ঠেলে দেয় এমন একটি দিয়ে আমি প্রদর্শন করতে বা আড়াল করতে চাই ।

আমি সেখানে কয়েকটি নমুনা দেখেছি কিন্তু সেগুলির কোনওোটাই আমার প্রয়োজন অনুসারে নয়।

আমি অ্যানিমেশনগুলির জন্য দুটি এক্সএমএল ফাইল তৈরি করেছি তবে আমি যখন এটির দৃশ্যমানতা পরিবর্তন করি তখন কীভাবে সেগুলি শুরু করবেন তা আমি জানি না LinearLayout

উত্তর:


639

অ্যানড্রয়েড 3.0.০ (মধুযন্ত্র) এ প্রবর্তিত নতুন অ্যানিমেশন এপিআই সহ এ জাতীয় অ্যানিমেশনগুলি তৈরি করা খুব সহজ।

Viewদূরত্বে একটি নীচে স্লাইডিং :

view.animate().translationY(distance);

আপনি পরে এর মতো Viewআগের অবস্থানে পিছনে স্লাইড করতে পারেন :

view.animate().translationY(0);

আপনি সহজেই একাধিক অ্যানিমেশন একত্রিত করতে পারেন। নিম্নলিখিত অ্যানিমেশনটি Viewতার উচ্চতা দ্বারা একটি নীচে স্লাইড হবে এবং একই সময়ে এটি বিবর্ণ হবে:

// Prepare the View for the animation
view.setVisibility(View.VISIBLE);
view.setAlpha(0.0f);

// Start the animation
view.animate()
    .translationY(view.getHeight())
    .alpha(1.0f)
    .setListener(null);

এরপরে আপনি Viewপিছনে বিবর্ণ হয়ে এটিকে আবার তার আসল অবস্থানে স্লাইড করতে পারেন। অ্যানিমেশনটি শেষ হয়ে গেলে আমরা পিছনে AnimatorListenerদৃশ্যমানতা সেট করতে পারি তাই আমরা একটি সেটও করেছি :ViewGONE

view.animate()
    .translationY(0)
    .alpha(0.0f)
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            view.setVisibility(View.GONE);
        }
    });

1
একবারে কেন দৃশ্যটি দৃশ্যমান হয় না?
রাম

1
আমি দৃশ্য দৃশ্যমান করতে চাই এবং কখন চলে যাই। কিন্তু যদি আমি প্রথম সর্বস্বান্ত দৃশ্য সক্ষম দৃশ্যমান এবং দেখুন জায়গা .এটা ফাঁকা
রাম

3
@ রম Viewযখন এর দৃশ্যমানতা সেট করা থাকে তখন আপনি অ্যানিমেট করে কী অর্জন করার চেষ্টা করছেন View.GONE? আপনি যদি এর বাইরে কিছুতে এর দৃশ্যমানতা সেট করে থাকেন View.VISIBLEতবে Viewতা দৃশ্যমান হবে না। আমি কি বুঝতে চাইছি বুঝতে পারছি না। আপনি আপনার অ্যানিমেশন দৃশ্যমান হতে চান, তাহলে দৃশ্যমানতা সেট না Viewকরার জন্য View.GONE
জাভার কাপেলার

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

12
@ জাভারকাপেলার আমার মনে হয় অনেকের সমস্যাটি হ'ল শ্রোতাকে onAnimationEndপ্রতিবার বহু-সংঘটিত অ্যানিমেশনের onAnimationEndজন্য ডেকে আনা হয় , যার অর্থ ভিউ প্রদর্শিত হওয়ার পরেও বলা হয়, যা তার দৃশ্যমানতা সেট করে দেয় ইত্যাদি ইত্যাদি
ওল্ডগোড

129

গৃহীত উত্তরটি প্রয়োগ করতে আমার সমস্যা হয়েছে। আমার আরও কিছু প্রসঙ্গ দরকার ছিল। এখন আমি এটি সন্ধান করেছি, এখানে একটি সম্পূর্ণ উদাহরণ:

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

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button myButton;
    View myView;
    boolean isUp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myView = findViewById(R.id.my_view);
        myButton = findViewById(R.id.my_button);

        // initialize as invisible (could also do in xml)
        myView.setVisibility(View.INVISIBLE);
        myButton.setText("Slide up");
        isUp = false;
    }

    // slide the view from below itself to the current position
    public void slideUp(View view){
        view.setVisibility(View.VISIBLE);
        TranslateAnimation animate = new TranslateAnimation(
                0,                 // fromXDelta
                0,                 // toXDelta
                view.getHeight(),  // fromYDelta
                0);                // toYDelta
        animate.setDuration(500);
        animate.setFillAfter(true);
        view.startAnimation(animate);
    }

    // slide the view from its current position to below itself
    public void slideDown(View view){
        TranslateAnimation animate = new TranslateAnimation(
                0,                 // fromXDelta
                0,                 // toXDelta
                0,                 // fromYDelta
                view.getHeight()); // toYDelta
        animate.setDuration(500);
        animate.setFillAfter(true);
        view.startAnimation(animate);
    }

    public void onSlideViewButtonClick(View view) {
        if (isUp) {
            slideDown(myView);
            myButton.setText("Slide up");
        } else {
            slideUp(myView);
            myButton.setText("Slide down");
        }
        isUp = !isUp;
    }
}

activity_mail.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.slideview.MainActivity">

    <Button
        android:id="@+id/my_button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:onClick="onSlideViewButtonClick"
        android:layout_width="150dp"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:id="@+id/my_view"
        android:background="#a6e1aa"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="200dp">

    </LinearLayout>

</RelativeLayout>

মন্তব্য

  • আমাকে সঠিক দিক নির্দেশ করার জন্য এই নিবন্ধটি ধন্যবাদ । এটি এই পৃষ্ঠার অন্যান্য উত্তরগুলির চেয়ে বেশি সহায়ক ছিল।
  • আপনি যদি স্ক্রিনে ভিউ দিয়ে শুরু করতে চান, তবে এটি হিসাবে আরম্ভ করবেন না INVISIBLE
  • যেহেতু আমরা এটিকে পুরোপুরি স্ক্রিনের বাইরে অ্যানিমেট করছি তাই এটিকে আবার সেট করার দরকার নেই INVISIBLE। আপনি যদি সম্পূর্ণ স্ক্রিনটি অ্যানিমেট না করে থাকেন তবে, তবে আপনি একটি আলফা অ্যানিমেশন যুক্ত করতে পারেন এবং একটি দিয়ে দৃশ্যমানতা সেট করতে পারেন AnimatorListenerAdapter
  • সম্পত্তি অ্যানিমেশন ডক্স

অ্যান্ড্রয়েড: দর্শন হিসাবে অ্যানিমেশনটিকে একটি আড়াল হিসাবে শুরু করতে দৃশ্যমানতা = "অদৃশ্য"
গুডলাইফ

2
আমি অ্যানিমেট.সেটফিলএফটার (সত্য) ব্যবহারের প্রস্তাব দিই না;
স্লাইড ভিউয়ের

2
লক্ষ্য করুন যে .setVisibility(View.INVISIBLE);স্লাইড আপ ছাড়া ফাংশনটি দৃষ্টিশক্তি প্রত্যাশার মতো কাজ করবে না।
অদ্বৈত এস

Translate Animationভিউ মুভ করে। যদি আপনি এর স্কেলিংয়ের মতো ভিউটি অ্যানিমেট করতে চান তবে ব্যবহার করুনScaleAnimation anim = new ScaleAnimation(1, 1, 0, 1)
জোহাব আলী

33

এখন ভিজিবিলিটি পরিবর্তন অ্যানিমেশনগুলি হওয়া উচিত Transition APIযার মাধ্যমে সমর্থন (অ্যান্ড্রয়েডেক্স) প্যাকেজ উপলব্ধ। স্লাইড ট্রানজিশন সহ কেবল ট্রানজিশনম্যানেজ.বেগিনডিলেয়েড ট্রান্সিশন পদ্ধতিটি কল করুন তারপরি দর্শনটির দৃশ্যমানতা পরিবর্তন করুন।

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

import androidx.transition.Slide;
import androidx.transition.Transition;
import androidx.transition.TransitionManager;

private void toggle(boolean show) {
    View redLayout = findViewById(R.id.redLayout);
    ViewGroup parent = findViewById(R.id.parent);

    Transition transition = new Slide(Gravity.BOTTOM);
    transition.setDuration(600);
    transition.addTarget(R.id.redLayout);

    TransitionManager.beginDelayedTransition(parent, transition);
    redLayout.setVisibility(show ? View.VISIBLE : View.GONE);
}

activity_main.xml

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

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="play" />

    <LinearLayout
        android:id="@+id/redLayout"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="#5f00"
        android:layout_alignParentBottom="true" />
</RelativeLayout>

পরীক্ষা করে দেখুন এই উত্তরটি অন্য ডিফল্ট এবং কাস্টম রূপান্তরটি উদাহরণ।


1
কী হওয়ার showকথা? একটি বুলিয়ান?
আকুবি

@কুবি হ্যাঁ, এটি হওয়া উচিত
আবা

1
অন্যতম সেরা এবং সহজ উত্তর! ধন্যবাদ!
krisDrOid

কেবল লক্ষণীয়ভাবে, এর জন্য প্রয়োজনminSdkVersion 21
lasec0203

@ lasec0203 নং, ক্লাসগুলি androidxপ্যাকেজ থেকে । এটি প্রাক 21 এপিআই উপর সূক্ষ্ম কাজ করে।
আশাকিরভ

30

সবচেয়ে সহজ সমাধান: android:animateLayoutChanges="true"আপনার মতামত ধারণকারী ধারকটিতে সেট করুন।

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

<LinearLayout android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    >

    <Views_which_change_visibility>

</LinearLayout>

এনিমেটিং লেআউট পরিবর্তনগুলি - অ্যান্ড্রয়েড বিকাশকারী এ সম্পর্কে আপনি আরও বিশদ জানতে পারেন


এটি সবচেয়ে সহজ তবে ফোন প্রস্তুতকারকের কারণে এর আচরণের পার্থক্য রয়েছে এবং তিনি কোড পরিবর্তন করেছেন
b2mob

এটি আলফাটিকে অ্যানিমেট করে, অবস্থানটি নয়।
সুরগাচ

হ্যাঁ, তবে এটি যদি আমি সঠিকভাবে বুঝতে পারি তবে মূল প্রশ্নটি ছিল। যদি আপনি অবস্থানগুলি অ্যানিমেট করতে চান তবে আপনি একটি পুনর্ব্যবহারযোগ্য ভিউ ব্যবহার করতে পারেন যা স্থিতিশীল আইডির সাথে ভিউহোল্ডার ব্যবহার করে uses
স্টেফান মেড্যাক

12

আপনি সঠিক শুরু করতে পারেন Animationযখন দৃশ্যমানতা LinearLayoutএকটি নতুন উপশ্রেণী তৈরি করে পরিবর্তন LinearLayoutএবং অগ্রাহ্য setVisibility()শুরু করার জন্য Animations। এর মতো কিছু বিবেচনা করুন:

public class SimpleViewAnimator extends LinearLayout
{
    private Animation inAnimation;
    private Animation outAnimation;

    public SimpleViewAnimator(Context context)
    {
        super(context);
    }

    public void setInAnimation(Animation inAnimation)
    {
        this.inAnimation = inAnimation;
    }

    public void setOutAnimation(Animation outAnimation)
    {
        this.outAnimation = outAnimation;
    }

    @Override
    public void setVisibility(int visibility)
    {
        if (getVisibility() != visibility)
        {
            if (visibility == VISIBLE)
            {
                if (inAnimation != null) startAnimation(inAnimation);
            }
            else if ((visibility == INVISIBLE) || (visibility == GONE))
            {
                if (outAnimation != null) startAnimation(outAnimation);
            }
        }

        super.setVisibility(visibility);
    }
}

1
আমি আসলে ভাল ভাল সাবক্লাস পদ্ধতির পছন্দ। আপনাকে অনেক ধন্যবাদ.
মিশেলরাপ

1
এটি, একটি দুর্দান্ত সমাধান যা আমি আমার বেসভিউতে প্রয়োগ করব। এর জন্য থেক্স!
ব্রাম ভ্যান্ডেনবুশে

1
এটি যখন দেখানোর সময় কাজ করে, যখন লুকানো হয়, অ্যানিমেশনটি দেখার আগে দৃশ্যটি অদৃশ্য হয়ে যায়। কোন workaround?
বার্নার্ডো

12
এই টুইটটি একটি ভয়ঙ্কর সমাধান @ এটি Viewনিজের অ্যানিমেশনগুলির জন্য দায়ী করে যা আপনি যা চান তা কখনও নয় । আপনি Viewনিজের অ্যাপ্লিকেশনের অন্য অংশে আলাদাভাবে অ্যানিমেট করতে চান তা কল্পনা করুন। তারপরে তুমি কি করবে? দৃশ্যমানতাটি স্বয়ংক্রিয়ভাবে অ্যানিমেটেড না করার জন্য একটি পতাকা যুক্ত করবেন? অ্যানিমেশনটি সরাতে সাবক্লাসটি Viewএবং ওভাররাইড setVisibility()? বা আরও খারাপ setVisibility()আরও একটি অ্যানিমেশন সঙ্গে বাস্তবায়ন ? এটি সেখান থেকে স্নিগ্ধ এবং কৃপণ হয়ে ওঠে। এই "সমাধান" ব্যবহার করবেন না।
জাভার কাপেলার

3
এটিকে অ্যানিমেটেডলাইনআলআউট
রোয়েল

12

Kotlin

উপর ভিত্তি করে Suragch এর উত্তর , এখানে দেখুন এক্সটেনশন ব্যবহার করে একটি মার্জিত উপায় হল:

fun View.slideUp(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, this.height.toFloat(), 0f)
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun View.slideDown(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, 0f, this.height.toFloat())
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

এবং তারপরে আপনি যেখানেই এটি ব্যবহার করতে চান, আপনার কেবল প্রয়োজন myView.slideUp()বাmyView.slideDown()


কেবল ত্রুটিটি হ'ল, "ভরাটআফটার = সত্য" এর দরকার নেই কারণ এটি শিশুদের দৃষ্টিভঙ্গিগুলিতে অ্যাক্সেসযোগ্যতা আটকে দেয়
রঞ্জন

এছাড়াও আপনাকে সম্ভবত স্লাইডডাউন অ্যানিমেশনটিতে শ্রোতা যুক্ত করতে হবে এবং ভিউটি অ্যানিমেশনএন্ডে যেতে হবে।
মনোহর রেড্ডি

9
if (filter_section.getVisibility() == View.GONE) {
    filter_section.animate()
            .translationY(filter_section.getHeight()).alpha(1.0f)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationStart(Animator animation) {
                    super.onAnimationStart(animation);
                    filter_section.setVisibility(View.VISIBLE);
                    filter_section.setAlpha(0.0f);
                }
            });
} else {
    filter_section.animate()
            .translationY(0).alpha(0.0f)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    filter_section.setVisibility(View.GONE);
                }
            });
}

10
এই উত্তর সহ সমস্যাগুলি: 1) ভয়ানক কোড ফর্ম্যাটিং। 2) আপনি কোড পোস্ট করতে একটি কোড স্নিপেট ব্যবহার করেন যা আসলে ব্রাউজারে চালানো যায় না। এটি কেবল দুটি অকেজো বোতাম যুক্ত করে না, তবে এটি সিনট্যাক্স হাইলাইটিংও ধ্বংস করে। 3) এটি কোনও ব্যাখ্যা বা উদ্দেশ্য ছাড়াই কেবল কিছু র্যান্ডম কোড ডাম্প। 4) আপনি অ্যানিমেশন সম্পাদন করার সময় দৃশ্যমানতা পরিবর্তন করছেন। এই স্পষ্টত কোড গন্ধ এটি এ ছাড়াও এটি সঠিকভাবে কাজ করবে না। দৃশ্যমানতা পরিবর্তন একটি নতুন বিন্যাস প্রক্রিয়া শুরু করে, তারপরেই অ্যানিমেশনটির সাথে কাজ করার মান রয়েছে values তালিকাটি আরও চলছে ...
জাভার কাপেলার

আমি ইতিমধ্যে ফর্ম্যাটিং ঠিক করতে আপনার উত্তর সম্পাদনা করেছি এবং কোড স্নিপেট একটি আসল কোড ব্লকে রূপান্তরিত। তবে আপনাকে
বাকীটি

দুঃখিত, এটি সঙ্গী পেয়েছে, আমি আপনার কাছ থেকে কোডটি তৈরি করেছি কারণ এটি আমার পক্ষে ভাল কাজ করে না, আমার এই কোডটি কাজ করে post তবে পোস্ট করার পথে পরিবর্তনগুলি আমি সম্মত।
আমিন মাহিন

@ আমীনমাহেন কীসের setAlphaজন্য?
ইগোরগানাপলস্কি

@ ইগর গণপলস্কি এটি স্বচ্ছতার জন্য অর্থাৎ একটি বিবর্ণ প্রভাব দেওয়ার জন্য ব্যবহৃত হয়
আমিন মাহিন

4

অ্যান্ড্রয়েড অ্যাপে বেলো কোড ব্যবহার করে আপনি যে কোনও ভিউ বা বিন্যাস স্লাইড করতে পারেন up

boolean isClicked=false;
LinearLayout mLayoutTab = (LinearLayout)findViewById(R.id.linearlayout);

        if(isClicked){
                    isClicked = false;
                    mLayoutTab.animate()
                    .translationYBy(120)
                    .translationY(0)     
                    .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime));

        }else{
                isClicked = true;
                mLayoutTab.animate()
                .translationYBy(0)
                .translationY(120)
                .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime));
                }

120 কি? এবং 0 কি? আমি যদি হার্ডকোড করতে চাই তবে সেটডিউরেশনের ইউনিট কী?
স্ট্যানলি সান্টোসো

1
এখানে 120 এবং 0 হ'ল ওয়াই অক্ষের সাথে সম্পর্কিত দূরত্বটি যদি আপনি বড় স্ক্রিন বা ট্যাবলেটে সমস্যা হওয়ার চেয়ে হার্ড কোড রাখেন তবে সমস্ত স্ট্রিংয়ের জন্য আপনার স্ট্রিং.এক্সএমএল মান থেকে মূল্য নেওয়া দরকার। এবং সময়কাল হ'ল সময় আপনি লেআউট অ্যানিমেশন প্রদর্শন করতে চান .... !!! আমার দূর্বল ইংরেজির জন্য দুঃখিত...!
varotariya vajsi

@ ভারোতারিয়াভাজি এটি কোনও দৃশ্যের দৃশ্যমানতা প্রদর্শন / আড়াল করে না।
ইগোরগানাপলস্কি

হ্যালো আইগর গণপলস্কি আমি এগুলি জানি ... এটি কেবলমাত্র দিকনির্দেশে দর্শনটির অনুবাদ করা হয়েছে, যদি ব্যবহারকারীকে নীচের স্লাইডারের মতো দেখানোর প্রয়োজন হয় তবে এটি ঠিকঠাক কাজ করবে।
varotariya vajsi

4

এই শ্রেণিটি ব্যবহার করুন:

public class ExpandCollapseExtention {

 public static void expand(View view) {
    view.setVisibility(View.VISIBLE);

    final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    view.measure(widthSpec, heightSpec);

    ValueAnimator mAnimator = slideAnimator(view, 0, view.getMeasuredHeight());
    mAnimator.start();
}


public static void collapse(final View view) {
    int finalHeight = view.getHeight();

    ValueAnimator mAnimator = slideAnimator(view, finalHeight, 0);

    mAnimator.addListener(new Animator.AnimatorListener() {

        @Override
        public void onAnimationEnd(Animator animator) {               
            view.setVisibility(View.GONE);
        }


        @Override
        public void onAnimationStart(Animator animation) {

        }


        @Override
        public void onAnimationCancel(Animator animation) {

        }


        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });
    mAnimator.start();
}


private static ValueAnimator slideAnimator(final View v, int start, int end) {

    ValueAnimator animator = ValueAnimator.ofInt(start, end);

    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {

            int value = (Integer) valueAnimator.getAnimatedValue();
            ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
            layoutParams.height = value;
            v.setLayoutParams(layoutParams);
        }
    });
    return animator;
}
}

3

অবজেক্ট অ্যানিমেটার ব্যবহার করে

private fun slideDown(view: View) {
    val height = view.height
    ObjectAnimator.ofFloat(view, "translationY", 0.toFloat(), height.toFloat()).apply {
        duration = 1000
        start()
    }
}

private fun slideUp(view: View) {
    val height = view.height
    ObjectAnimator.ofFloat(view, "translationY", height.toFloat(),0.toFloat()).apply {
        duration = 1000
        start()
    }
}

2
অপ্রাপ্তবয়স্ক ইমপ্রুভমেন্টস: আমরা "ট্রান্সলেশনওয়াই" এর পরিবর্তে ধ্রুবক ভিউ.আরআরএলএশন_ওয়াই ব্যবহার করতে পারি এবং স্লাইড আপ অবজেক্ট অ্যানিমেশনও আমরা করতে পারি app
তাশি

0.toFloat()এছাড়াও শুধু হতে পারে0f
styler1972

2

আমার একটি কোণার কেস ছিল যেখানে আমার দেখার উচ্চতা এখনও zeroএতটা ...

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.view.View;

public final class AnimationUtils {

  public static void slideDown(final View view) {
        view.animate()
                .translationY(view.getHeight())
                .alpha(0.f)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        // superfluous restoration
                        view.setVisibility(View.GONE);
                        view.setAlpha(1.f);
                        view.setTranslationY(0.f);
                    }
                });
    }

    public static void slideUp(final View view) {
        view.setVisibility(View.VISIBLE);
        view.setAlpha(0.f);

        if (view.getHeight() > 0) {
            slideUpNow(view);
        } else {
            // wait till height is measured
            view.post(new Runnable() {
                @Override
                public void run() {
                    slideUpNow(view);
                }
            });
        }
    }

    private static void slideUpNow(final View view) {
        view.setTranslationY(view.getHeight());
        view.animate()
                .translationY(0)
                .alpha(1.f)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        view.setVisibility(View.VISIBLE);
                        view.setAlpha(1.f);
                    }
                });
    }

}

1

এখানে আমার সমাধান। আপনার দর্শনের জন্য কেবল একটি রেফারেন্স পান এবং এই পদ্ধতিটি কল করুন:

public static void animateViewFromBottomToTop(final View view){

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {

            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            final int TRANSLATION_Y = view.getHeight();
            view.setTranslationY(TRANSLATION_Y);
            view.setVisibility(View.GONE);
            view.animate()
                .translationYBy(-TRANSLATION_Y)
                .setDuration(500)
                .setStartDelay(200)
                .setListener(new AnimatorListenerAdapter() {

                    @Override
                    public void onAnimationStart(final Animator animation) {

                        view.setVisibility(View.VISIBLE);
                    }
                })
                .start();
        }
    });
}

অন্য কিছু করার দরকার নেই =)


1
এটি করার জন্য আপনার কেন গ্লোবাল লেআউটলাইস্টেনারের প্রয়োজন হবে? আপনি কেন এমন অদ্ভুত উপায়ে দৃশ্যমানতাটি সেট করছেন? আপনি কেন একটি শুরুর বিলম্বের মতো বিষয়গুলি অন্তর্ভুক্ত করছেন যা আপনার উত্তরের প্রশ্নের সাথে সম্পর্কিত নয়?
জাভের ক্যাপেলার

1

কোটলিনে সুরগচের উত্তর। এটি আমার পক্ষে কাজ করেছে।

class MainActivity : AppCompatActivity() {

var isUp: Boolean = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    var myView: View = findViewById(R.id.my_view)
    var myButton: Button = findViewById(R.id.my_button)

    //Initialize as invisible
    myView.visibility = View.INVISIBLE
    myButton.setText("Slide up")

    isUp = false

}


fun View.slideUp(duration: Int = 500){
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, this.height.toFloat(), 0f)
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun View.slideDown(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, 0f, this.height.toFloat())
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun onSlideViewButtonClick(view: View){
    if(isUp){
        my_view.slideDown()
        my_button.setText("Slide Up")

    }
    else{
        my_view.slideUp()
        my_button.setText("Slide Down")
    }
    isUp = !isUp
}

}


0

অ্যানিমেশনটি দেখানোর জন্য আপনি কোডের সহজ তিনটি লাইন ব্যবহার করতে পারেন ...

//getting the hiding view by animation

 mbinding.butn.setOnClickListener {

                val SlideOutLeft = AnimationUtils.loadAnimation(this, R.anim.slide_out_left)
                simplelayout.visibility = View.INVISIBLE
                simplelayout.startAnimation(SlideOutLeft)


                val SlideInRight = AnimationUtils.loadAnimation(applicationContext, R.anim.slide_in_right)
                animation1.visibility = View.VISIBLE
                animation1.startAnimation(SlideInRight)

            }
            //again unhide the view animation
            mbinding.buttn.setOnClickListener {


               val SlideInLeft=AnimationUtils.loadAnimation(this,R.anim.slide_in_left)
                //set the layout
               simplelayout.visibility=View.VISIBLE
               simplelayout.startAnimation(SlideInLeft)

               val SlideOutRight=AnimationUtils.loadAnimation(this,R.anim.slide_out_right)
               animation1.visibility=View.INVISIBLE
               animation1.startAnimation(SlideOutRight)

            }

0

কোটলিন এক্সটেনশনের সাহায্যে আপনি এটি ব্যবহার করতে পারেন:

enum class SlideDirection{
    UP,
    DOWN,
    LEFT,
    RIGHT
}

enum class SlideType{
    SHOW,
    HIDE
}

fun View.slideAnimation(direction: SlideDirection, type: SlideType, duration: Long = 250){
    val fromX: Float
    val toX: Float
    val fromY: Float
    val toY: Float
    val array = IntArray(2)
    getLocationInWindow(array)
    if((type == SlideType.HIDE && (direction == SlideDirection.RIGHT || direction == SlideDirection.DOWN)) ||
        (type == SlideType.SHOW && (direction == SlideDirection.LEFT || direction == SlideDirection.UP))   ){
        val displayMetrics = DisplayMetrics()
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        val deviceWidth = displayMetrics.widthPixels
        val deviceHeight = displayMetrics.heightPixels
        array[0] = deviceWidth
        array[1] = deviceHeight
    }
    when (direction) {
        SlideDirection.UP -> {
            fromX = 0f
            toX = 0f
            fromY = if(type == SlideType.HIDE) 0f else (array[1] + height).toFloat()
            toY = if(type == SlideType.HIDE) -1f * (array[1] + height)  else 0f
        }
        SlideDirection.DOWN -> {
            fromX = 0f
            toX = 0f
            fromY = if(type == SlideType.HIDE) 0f else -1f * (array[1] + height)
            toY = if(type == SlideType.HIDE) 1f * (array[1] + height)  else 0f
        }
        SlideDirection.LEFT -> {
            fromX = if(type == SlideType.HIDE) 0f else 1f * (array[0] + width)
            toX = if(type == SlideType.HIDE) -1f * (array[0] + width) else 0f
            fromY = 0f
            toY = 0f
        }
        SlideDirection.RIGHT -> {
            fromX = if(type == SlideType.HIDE) 0f else -1f * (array[0] + width)
            toX = if(type == SlideType.HIDE) 1f * (array[0] + width) else 0f
            fromY = 0f
            toY = 0f
        }
    }
    val animate = TranslateAnimation(
        fromX,
        toX,
        fromY,
        toY
    )
    animate.duration = duration
    animate.setAnimationListener(object: Animation.AnimationListener{
        override fun onAnimationRepeat(animation: Animation?) {

        }

        override fun onAnimationEnd(animation: Animation?) {
            if(type == SlideType.HIDE){
                visibility = View.INVISIBLE
            }
        }

        override fun onAnimationStart(animation: Animation?) {
            visibility = View.VISIBLE
        }

    })
    startAnimation(animate)
}

বর্ধনের উদাহরণ:

view.slideAnimation(SlideDirection.UP, SlideType.HIDE)//to make it disappear through top of the screen
view.slideAnimation(SlideDirection.DOWN, SlideType.SHOW)//to make it reappear from top of the screen

view.slideAnimation(SlideDirection.DOWN, SlideType.HIDE)//to make it disappear through bottom of the screen
view.slideAnimation(SlideDirection.UP, SlideType.SHOW)//to make it reappear from bottom of the screen

0

একটি সহজ উপায়:

containerView.setLayoutTransition(LayoutTransition())
containerView.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.