programing

Android ListView 행을 추가 또는 제거하는 애니메이션 방법

iphone6s 2023. 8. 15. 10:54
반응형

Android ListView 행을 추가 또는 제거하는 애니메이션 방법

iOS에는 UITableView 행을 추가하고 제거하는 애니메이션을 만드는 매우 쉽고 강력한 기능이 있습니다. 여기 유튜브 동영상에서 기본 애니메이션을 보여주는 동영상이 있습니다.주변 행이 삭제된 행에 어떻게 접히는지 기록합니다.이 애니메이션은 사용자가 목록에서 변경된 내용과 데이터가 변경되었을 때 목록에서 보고 있던 위치를 추적하는 데 도움이 됩니다.

Android에서 개발한 이후로 TableView에서 개별 행을 애니메이션화할 만한 기능을 찾지 못했습니다.내 어댑터를 호출하면 ListView가 즉시 내용을 새 정보로 업데이트합니다.데이터가 변경될 때 새 행을 밀어넣거나 밀어내는 간단한 애니메이션을 보여주고 싶지만 문서화된 방법을 찾을 수 없습니다.LayoutAnimationController는 이것을 작동시키는 열쇠를 쥐고 있는 것처럼 보이지만, ListView에서 LayoutAnimationController를 설정하고(ApiDemo의 LayoutAnimation2와 유사함) 목록이 표시된 후 어댑터에서 요소를 제거하면 요소가 애니메이션에서 나오는 대신 즉시 사라집니다.

제거된 개별 항목을 애니메이션화하기 위해 다음과 같은 작업도 시도했습니다.

@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
    Animation animation = new ScaleAnimation(1, 1, 1, 0);
    animation.setDuration(100);
    getListView().getChildAt(position).startAnimation(animation);
    l.postDelayed(new Runnable() {
        public void run() {
            mStringList.remove(position);
            mAdapter.notifyDataSetChanged();
        }
    }, 100);
}

그러나 애니메이션 행을 둘러싼 행은 다음과 같은 경우 새 위치로 이동할 때까지 위치를 이동하지 않습니다.notifyDataSetChanged()이 호출됩니다.요소를 배치한 후에는 ListView가 레이아웃을 업데이트하지 않는 것으로 나타납니다.

ListView의 구현/포크를 직접 작성하는 것이 제 머리에 떠올랐지만, 이것은 그렇게 어렵지 않을 것 같습니다.

감사합니다!

Animation anim = AnimationUtils.loadAnimation(
                     GoTransitApp.this, android.R.anim.slide_out_right
                 );
anim.setDuration(500);
listView.getChildAt(index).startAnimation(anim );

new Handler().postDelayed(new Runnable() {

    public void run() {

        FavouritesManager.getInstance().remove(
            FavouritesManager.getInstance().getTripManagerAtIndex(index)
        );
        populateList();
        adapter.notifyDataSetChanged();

    }

}, anim.getDuration());

하향식 애니메이션의 경우

<set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromYDelta="20%p" android:toYDelta="-20"
            android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

RecyclerView애니메이션 추가, 제거 및 재실행을 처리합니다!

RecyclerView in action

간단한 Android Studio 프로젝트는 다음을 특징으로 합니다.RecyclerView커밋을 살펴봅니다.

  1. 고전적인 헬로 월드 안드로이드 앱의 커밋
  2. 커밋, 프로젝트에 RecyclerView 추가(콘텐츠가 동적이 아님)
  3. 커밋, 런타임에 RecyclerView의 내용을 수정하는 기능 추가(애니메이션 없음)
  4. 그리고 마지막으로...RecyclerView에 애니메이션을 추가합니다.

Google 솔루션을 살펴보십시오.여기에는 삭제 방법만 있습니다.

ListViewRemovalAnimation 프로젝트 코드 및 비디오 데모

안드로이드 4.1+(API 16)가 필요합니다.하지만 우리는 2014년이 밖에 있습니다.

때부터ListViews매우 최적화되어 있습니다. 제 생각에는 이것을 달성하는 것이 불가능합니다. ListView에 함)로를 ?LinearLayout 그들을 그리고 그들을 애니메이션화합니까?

오른쪽으로 스윕을 애니메이션화하는 것을 고려해 본 적이 있습니까?목록 항목의 맨 위에 점진적으로 더 큰 흰색 막대를 그린 다음 목록에서 제거하는 것과 같은 작업을 수행할 수 있습니다.다른 세포들은 여전히 제자리에 있지만 없는 것보다는 낫습니다.

통화 목록 보기.목록을 변경하기 전에 레이아웃 애니메이션 예약()

목록 보기를 조작할 필요 없이 다른 방법을 함께 해킹했습니다.안타깝게도 일반 안드로이드 애니메이션은 행의 내용을 조작하는 것처럼 보이지만 실제로 보기를 축소하는 데는 효과가 없습니다.먼저 다음 처리기를 고려합니다.

private Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
    Bundle bundle = message.getData();

    View view = listView.getChildAt(bundle.getInt("viewPosition") - 
        listView.getFirstVisiblePosition());

    int heightToSet;
    if(!bundle.containsKey("viewHeight")) {
        Rect rect = new Rect();
        view.getDrawingRect(rect);
        heightToSet = rect.height() - 1;
    } else {
        heightToSet = bundle.getInt("viewHeight");
    }

    setViewHeight(view, heightToSet);

    if(heightToSet == 1)
        return;

    Message nextMessage = obtainMessage();
    bundle.putInt("viewHeight", (heightToSet - 5 > 0) ? heightToSet - 5 : 1);
    nextMessage.setData(bundle);
    sendMessage(nextMessage);
}

목록 어댑터에 이 컬렉션을 추가합니다.

private Collection<Integer> disabledViews = new ArrayList<Integer>();

추가

public boolean isEnabled(int position) {
   return !disabledViews.contains(position);
}

다음으로 행을 숨기려는 위치에 다음을 추가합니다.

Message message = handler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt("viewPosition", listView.getPositionForView(view));
message.setData(bundle);
handler.sendMessage(message);    
disabledViews.add(listView.getPositionForView(view));

바로 그거야!한 번에 높이를 축소하는 픽셀 수를 변경하여 애니메이션 속도를 변경할 수 있습니다.정교하진 않지만, 효과가 있어요!

ListView에 새 행을 삽입한 후 ListView를 새 위치로 스크롤합니다.

ListView.smoothScrollToPosition(position);

시도해보지는 않았지만 애니메이션 레이아웃 변경은 당신이 원하는 것을 해야 할 것 같습니다.ImageSwitcher 클래스에 표시됩니다. ViewSwitcher 클래스에도 표시됩니까?

Android는 오픈 소스이므로 ListView의 최적화를 실제로 다시 구현할 필요가 없습니다.당신은 ListView의 코드를 잡고 애니메이션에서 해킹하는 방법을 찾을 수 있고, 안드로이드 버그 트래커에서 기능 요청을 열 수도 있습니다(그리고 그것을 구현하기로 결정했다면 패치를 제공하는 것을 잊지 마십시오).

참고로 ListView 소스 코드는 여기 있습니다.

다음은 행을 삭제하고 다시 정렬할 수 있는 소스 코드입니다.

데모 APK 파일도 사용할 수 있습니다.행 삭제는 상단 뷰를 스와이프한 후 하단 뷰를 보여주는 구글의 Gmail 앱 라인을 따라 더 많이 수행됩니다.아래쪽 보기에는 실행 취소 단추 또는 원하는 모든 단추가 있을 수 있습니다.

제가 제 사이트에서 제 접근 방식을 설명했듯이, 저는 링크를 공유했습니다.어쨌든 그 아이디어는 도면 캐시를 가져와서 비트맵을 만드는 것입니다. 두 개의 비트맵을 가지고 있고 이동 효과를 만들기 위해 아래쪽 비트맵을 애니메이션화합니다.

다음 코드를 참조하십시오.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        public void onItemClick(AdapterView<?> parent, View rowView, int positon, long id)
        {
            listView.setDrawingCacheEnabled(true);
            //listView.buildDrawingCache(true);
            bitmap = listView.getDrawingCache();
            myBitmap1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), rowView.getBottom());
            myBitmap2 = Bitmap.createBitmap(bitmap, 0, rowView.getBottom(), bitmap.getWidth(), bitmap.getHeight() - myBitmap1.getHeight());
            listView.setDrawingCacheEnabled(false);
            imgView1.setBackgroundDrawable(new BitmapDrawable(getResources(), myBitmap1));
            imgView2.setBackgroundDrawable(new BitmapDrawable(getResources(), myBitmap2));
            imgView1.setVisibility(View.VISIBLE);
            imgView2.setVisibility(View.VISIBLE);
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(0, rowView.getBottom(), 0, 0);
            imgView2.setLayoutParams(lp);
            TranslateAnimation transanim = new TranslateAnimation(0, 0, 0, -rowView.getHeight());
            transanim.setDuration(400);
            transanim.setAnimationListener(new Animation.AnimationListener()
            {
                public void onAnimationStart(Animation animation)
                {
                }

                public void onAnimationRepeat(Animation animation)
                {
                }

                public void onAnimationEnd(Animation animation)
                {
                    imgView1.setVisibility(View.GONE);
                    imgView2.setVisibility(View.GONE);
                }
            });
            array.remove(positon);
            adapter.notifyDataSetChanged();
            imgView2.startAnimation(transanim);
        }
    });

이미지에 대한 자세한 내용은 다음을 참조하십시오.

감사해요.

저는 이것과 비슷한 일을 했습니다.한 가지 접근 방식은 애니메이션 시간 동안 행 내부의 시간 경과에 따른 뷰 높이를 보간하는 것입니다.onMeasure발행 중에requestLayout()listView에 해당합니다.네, listView code 안에서 직접 하는 것이 더 나을 수도 있지만 빠른 해결책이었습니다. (좋아 보였어요!

다른 접근 방식을 공유하는 것뿐입니다.

먼저 목록 보기의 Android:animateLayoutChanges를 true로 설정합니다.

<ListView
        android:id="@+id/items_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true"/>

그런 다음 처리기를 사용하여 항목을 추가하고 목록 보기를 지연하여 업데이트합니다.

Handler mHandler = new Handler();
    //delay in milliseconds
    private int mInitialDelay = 1000;
    private final int DELAY_OFFSET = 1000;


public void addItem(final Integer item) {
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    mDataSet.add(item);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                }
            }).start();

        }
    }, mInitialDelay);
    mInitialDelay += DELAY_OFFSET;
}

언급URL : https://stackoverflow.com/questions/3928193/how-to-animate-addition-or-removal-of-android-listview-rows

반응형