안 드 로 이 드(android)모방 전자상거래 app 상품 상세 페이지 버튼 유동 효과
이 효 과 는 사용자 체험 이 여전히 멋 있 습 니 다.오늘 우 리 는 이 효 과 를 어떻게 실현 하 는 지 설명 하 겠 습 니 다.
2.분석
이해 하기 편리 하도록 그림 을 그 려 분석 하 다.
그림 에서 보 듯 이 전체 페이지 는 네 부분 으로 나 뉜 다.
1.부상 내용,
floatView
2.상단 내용,headView
3.중간 내용,부상 내용 과 동일,middleView
4.상품 상세 설명 페이지,detailView
페이지 내용 의 높이 가 화면 을 초과 하기 때문에Scrollview
로 스크롤 을 실현 하고 부상view
은scrollview
과 같은 등급 으로 한 프레임 의 구조 나 상대 적 인 구조 에 있 습 니 다.Y 방향의 스크롤 거 리 는 중간 내용
middleView
보다 작 을 때middleView
당연히 이 페이지 가 위로 미 끄 러 지면 서 사라 집 니 다.우 리 는 부상view
을 표시 하여middleView
상단 에 걸 려 있 는 효 과 를 실현 합 니 다.Y 방향 스크롤 거리 가 중간 내용
middleView
보다 크 면 상단 의 거 리 를 수용 할 때 부유view
를 숨 기 면 됩 니 다.분석 을 통 해 우 리 는
scrollview
의 굴 러 가 는 거리 와middleView
꼭대기 까지 의 높이 만 알 면 된다 는 것 을 발견 했다.이로써 복잡 한 상호작용 효 과 를 두 개의 간단 한 api 로 바 꾸 었 다.3.첫 번 째 방법 실현
3.1 middleView 의 부모 용기 상단 까지 의 거 리 를 가 져 옵 니 다.
tv_title.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
mTitleTopAndHeight = tv_title.getTop();
tv_title.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
activityoncreate()
에서 view 의getTop()
방법 으로 view 의 높이 를 직접 얻 으 면 0 으로 돌아 갑 니 다.이 는 이때 view 가 화면 에 그리 지 않 았 기 때문에 우 리 는 위의 방법 으로 view 에 감청 을 설정 하여 얻 을 수 있 습 니 다.여러 번 그 릴 수 있 기 때문에 감청 사건 을 제거 하 는 것 을 기억 합 니 다.다음 코드 역시 가 져 올 수 있 습 니 다:
tv_title.post(new Runnable()
{
@Override
public void run()
{
mTitleTopAndHeight = tv_title.getTop();
}
});
post
방법 을 이용 하여 작업 을 대기 열 에 넣 고 시스템 레이아웃 이 완 료 된 후에 대기 열 에 있 는 이 벤트 를 실행 하면 정확 한view
값 을 얻 을 수 있 습 니 다.3.2 수직 방향 스크롤 거리 가 져 오기
top
의 부모 클래스Scrollview
에서 내용 변화 방법View
이 있 습 니 다.이 방법 은onScrollChanged(),
의 외부 에서 호출 할 수 없 지만 내부 에 서 는protect
스크롤 할 때 이 방법 을 실행 하기 때문에scrollview
이MyScrollView
에서 스크롤 거 리 를 외부 로 전달 하 는 것 을 사용자 정의 합 니 다.사용자 정의 scrollview 전체 코드 는 다음 과 같 습 니 다.
public class MyScrollView extends ScrollView
{
private OnScrollListener mOnScrollListener;
/**
*
*/
private boolean mIsTouch = false;
public MyScrollView(Context context)
{
this(context, null);
}
public MyScrollView(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt)
{
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollListener != null)
{
mOnScrollListener.onScroll(t, mIsTouch ? OnScrollListener.SCROLL_STATE_TOUCH_SCROLL : OnScrollListener.SCROLL_STATE_FLING);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
switch (ev.getAction())
{
case MotionEvent.ACTION_MOVE:
mIsTouch = true;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mIsTouch = false;
break;
}
return super.onTouchEvent(ev);
}
public void setOnScrollListener(OnScrollListener onScrollListener)
{
mOnScrollListener = onScrollListener;
}
public interface OnScrollListener
{
/**
*
*/
int SCROLL_STATE_TOUCH_SCROLL = 0x0;
/**
*
*/
int SCROLL_STATE_FLING = 0x1;
/**
*
*
* @param scrollY Y
* @param scroll_state :
*/
void onScroll(int scrollY, int scroll_state);
}
}
3.3 사용onScrollChanged()
에서acitivity
사용자 정의 스크롤 감청 이 벤트 를 설정 하면 됩 니 다.
mScrollView.setOnScrollListener(new MyScrollView.OnScrollListener()
{
@Override
public void onScroll(int scrollY, int state)
{
Log.d("onScroll: ", scrollY + "" + "----------- state:" + state);
if (scrollY <= mTitleTopAndHeight)
{
tv_float.setVisibility(View.INVISIBLE);
} else
{
tv_float.setVisibility(View.VISIBLE);
}
}
});
이렇게 수직 방법의 스크롤 값 을 통 해scrollview
의 디 스 플레이 숨 김 을 제어 합 니 다.
tv_float.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
mScrollView.onTouchEvent(event);
return false;
}
});
부유floatView
에 터치 감청 을 설정 하고 사용자 의 손짓 을view
에 전달 하면 사용자 가 미끄러져 부유scrollView
할 때 내용 구역 도 따라 굴 러 갈 수 있다.다음은 레이아웃 코드 입 니 다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.example.qike.scrolltitle.MyScrollView
android:id="@+id/sv_main"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:gravity="center"
android:text=" "/>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#a3c"
android:gravity="center"
android:text=" view"/>
<TextView
android:layout_width="match_parent"
android:layout_height="600dp"
android:background="#a2bb"
android:gravity="center"
android:text=" "/>
</LinearLayout>
</com.example.qike.scrolltitle.MyScrollView>
<TextView
android:id="@+id/tv_float"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#a3c"
android:gravity="center"
android:text=" view"
android:visibility="invisible"/>
</RelativeLayout>
4.두 번 째 방식이 방법 과 첫 번 째 방식 의 차 이 는 스크롤 위 치 를 얻 는 방법 이 다 르 기 때문에 이 방법 은 더욱 간단 하 다.
mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener()
{
@Override
public void onScrollChanged()
{
int scrollY = mScrollView.getScrollY();
if (scrollY <= mTitleTopAndHeight)
{
tv_float.setVisibility(View.INVISIBLE);
} else
{
tv_float.setVisibility(View.VISIBLE);
}
}
});
이런 간단 한 방법 으로 감청 을 직접 설치 하 는데 왜 첫 번 째 방법 을 소개 하 느 냐 는 독자 들 의 질문 이 있 을 수 있다.세심 한 당신 은 첫 번 째 방법 에서 제 가 사용자 정의 감청 사건 에서 현재 반전 상 태 를 나타 내 는 매개 변수view
를 되 돌 렸 다 는 것 을 알 게 되 었 을 것 입 니 다.많은 app 은 사용자 가 수 동 으로 스크롤 과 관성 스크롤 을 끌 어 당 기 는 처리 가 불가능 하기 때 문 입 니 다.예 를 들 어 타 오 바 오 상품 상세 페이지 는 경계 값 중간statue
의view
값 에 이 르 렀 을 때 사용자 가 수 동 으로 거 리 를 끌 어야 바닥 의 상세 한 모습 을 끌 어 낼 수 있 고 관성 이 미 끄 러 지면 멈 출 수 밖 에 없다.5.총화
이상 은 안 드 로 이 드 실현 버튼 이 상하 로 굴 러 가면 서 고정 위치 에 떠 있 는 방법 에 관 한 것 입 니 다.본 논문 의 내용 이 안 드 로 이 드 개발 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.