안 드 로 이 드 모방 경 동,티몰 드 롭 다운 리 셋 효과
14778 단어 Android드 롭 다운 리 셋
1.프레임 워 크 사용 Android-Ultra-Pull-To-Refresh
https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh
여러분 이 관심 이 있 는 것 은 이 드 롭 다운 리 셋 프레임 워 크 를 보 세 요.확장 성 이 매우 강하 고 각종 View 의 드 롭 다운 리 셋 사건 을 호 환 할 수 있 습 니 다.
2.경 동 드 롭 다운 리 셋
먼저 경 동의 드 롭 다운 리 셋 애니메이션 을 보 세 요.
위의 그림 에서 알 수 있 듯 이 애니메이션 입 니 다.물론 캡 처 가 좀 끊 깁 니 다.먼저,우 리 는 핸드폰 경 동의 app 을 풀 고 위의 그림 을 얻 었 습 니 다.
먼저 머리 새로 고침 의 포석 이 어떻게 실현 되 는 지 보 세 요.
jd_refresh_header_view.xml
<?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="wrap_content">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/layout_tx">
<ImageView
android:id="@+id/iv_man"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/a2a" />
<ImageView
android:id="@+id/iv_goods"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center"
android:src="@drawable/a29" />
</FrameLayout>
<LinearLayout
android:id="@+id/layout_tx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginLeft="5dp"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" "
android:textSize="14sp" />
<TextView
android:id="@+id/tv_remain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text=" "
android:textSize="12sp" />
</LinearLayout>
</RelativeLayout>
android-Ultra-Pull-To-Refresh 프레임 워 크 를 다시 봅 시다.
package in.srain.cube.views.ptr;
import in.srain.cube.views.ptr.indicator.PtrIndicator;
/**
*
*/
public interface PtrUIHandler {
/**
* When the content view has reached top and refresh has been completed, view will be reset.
*
* @param frame
*/
public void onUIReset(PtrFrameLayout frame);
/**
* prepare for loading
*
* @param frame
*/
public void onUIRefreshPrepare(PtrFrameLayout frame);
/**
* perform refreshing UI
*/
public void onUIRefreshBegin(PtrFrameLayout frame);
/**
* perform UI after refresh
*/
public void onUIRefreshComplete(PtrFrameLayout frame);
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator);
}
이것 은 드 롭 다운 리 셋 이벤트 처리 인터페이스 입 니 다.리 셋 준비,리 셋 시작,리 셋 완료 와 리 셋 변경 등 이벤트 의 처 리 를 포함 하여 코드 를 직접 올 립 니 다.JdRefreshHeader.java
package com.jackie.pulltorefresh.jd;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import com.jackie.pulltorefresh.R;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrUIHandler;
import in.srain.cube.views.ptr.indicator.PtrIndicator;
/**
* HeaderView
*/
public class JdRefreshHeader extends FrameLayout implements PtrUIHandler {
/**
*
*/
private TextView mTvRemind;
/**
* logo
*/
private ImageView mIvMan;
/**
* logo
*/
private ImageView mIvGoods;
/**
*
*/
private int mState;
/**
*
*
*
*
*/
public static final int STATE_RESET = -1;
public static final int STATE_PREPARE = 0;
public static final int STATE_BEGIN = 1;
public static final int STATE_FINISH = 2;
public static final int MARGIN_RIGHT = 100;
/**
*
*/
private AnimationDrawable mAnimationDrawable;
public JdRefreshHeader(Context context) {
this(context, null);
}
public JdRefreshHeader(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public JdRefreshHeader(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
/**
* view
*/
private void initView() {
View view = LayoutInflater.from(getContext()).inflate(R.layout.jd_refresh_header_view, this, false);
mTvRemind = (TextView) view.findViewById(R.id.tv_remain);
mIvMan = (ImageView) view.findViewById(R.id.iv_man);
mIvGoods = (ImageView) view.findViewById(R.id.iv_goods);
addView(view);
}
@Override
public void onUIReset(PtrFrameLayout frame) {
mState = STATE_RESET;
}
@Override
public void onUIRefreshPrepare(PtrFrameLayout frame) {
mState = STATE_PREPARE;
}
@Override
public void onUIRefreshBegin(PtrFrameLayout frame) {
mState = STATE_BEGIN;
// logo,
mIvGoods.setVisibility(View.GONE);
mIvMan.setBackgroundResource(R.drawable.runningman);
mAnimationDrawable = (AnimationDrawable) mIvMan.getBackground();
if (!mAnimationDrawable.isRunning()) {
mAnimationDrawable.start();
}
}
@Override
public void onUIRefreshComplete(PtrFrameLayout frame) {
mState = STATE_FINISH;
mIvGoods.setVisibility(View.VISIBLE);
//
if (mAnimationDrawable.isRunning()) {
mAnimationDrawable.stop();
}
mIvMan.setBackgroundResource(R.drawable.a2a);
}
@Override
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {
//
switch (mState) {
case STATE_PREPARE:
//logo
mIvMan.setAlpha(ptrIndicator.getCurrentPercent());
mIvGoods.setAlpha(ptrIndicator.getCurrentPercent());
LayoutParams params = (LayoutParams) mIvMan.getLayoutParams();
if (ptrIndicator.getCurrentPercent() <= 1) {
mIvMan.setScaleX(ptrIndicator.getCurrentPercent());
mIvMan.setScaleY(ptrIndicator.getCurrentPercent());
mIvGoods.setScaleX(ptrIndicator.getCurrentPercent());
mIvGoods.setScaleY(ptrIndicator.getCurrentPercent());
int marginRight = (int) (MARGIN_RIGHT - MARGIN_RIGHT * ptrIndicator.getCurrentPercent());
params.setMargins(0, 0, marginRight, 0);
mIvMan.setLayoutParams(params);
}
if (ptrIndicator.getCurrentPercent() < 1.2) {
mTvRemind.setText(" ...");
} else {
mTvRemind.setText(" ...");
}
break;
case STATE_BEGIN:
mTvRemind.setText(" ...");
break;
case STATE_FINISH:
mTvRemind.setText(" ...");
break;
}
}
}
멤버 변수 mState 를 만 듭 니 다.드 롭 다운 새로 고침 을 저장 할 때 모든 상 태 를 저장 한 다음 에 저 장 된 상태 에 따라 UIPosition Change 인터페이스 에서 UI 를 수정 하고 각 상태 텍스트 의 알림 을 저장 합 니 다.드 롭 다운 과정 에서 UIPosition Change 의 리 셋 을 통 해 PtrIndicator 에서 드 롭 다운 백분율 을 얻 을 수 있 습 니 다.이 백분율 에 따라 우 리 는 많은 것 을 할 수 있다.예 를 들 어 경 동의 택배 작은 형 이 멀리 서 달 려 와 서 상품 을 가 져 오고 택배 작은 형 과 상품 간 의 크기 는 모두 이 PtrIndicator 백분율 에 따라 그 크기 의 비례 를 설정 할 수 있다.이 과정 에서 내 가 사용 하 는 방법 은 marginRight 를 이용 하여 이들 의 거 리 를 설정 하 는 것 이다.드 롭 다운 리 셋 의 한계점 에 이 르 렀 을 때 택배 작은 형 과 상품 간 의 margin 은 0 으로 택배 작은 형 이 상품 을 얻 는 효 과 를 얻 었 다.그리고 리 셋 할 때 상품 을 숨 기 고 전에 제공 한 세 장의 그림 을 사용 하여 효과 적 인 전환 을 한다.즉,애니메이션 이다.
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item
android:drawable="@drawable/a2b"
android:duration="70" />
<item
android:drawable="@drawable/a2c"
android:duration="70" />
<item
android:drawable="@drawable/a2d"
android:duration="70" />
</animation-list>
효과 도 는 다음 과 같다.3.티몰 드 롭 다운 리 셋
고양이 의 것 은 더욱 간단 하고 애니메이션 이 라 고 할 수 없습니다.말하자면 GIF 입 니 다.여러분 은 apk 를 다운로드 하고 스트레스 를 풀 면 gif 를 얻 을 수 있 습 니 다.원 리 는 이전 과 같 지만 여기 서 제 가 사용 하 는 것 은 free sco 로 gif 를 불 러 오 는 것 입 니 다.방법 이 많 습 니 다.관심 이 있 으 시 면 한번 해 보 세 요.
TmallRefreshHeader.java
package com.jackie.pulltorefresh.tmall;
import android.content.Context;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.jackie.pulltorefresh.R;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrUIHandler;
import in.srain.cube.views.ptr.indicator.PtrIndicator;
/**
* HeaderView
*/
public class TmallRefreshHeader extends FrameLayout implements PtrUIHandler {
/**
*
*/
private TextView mTvRemind;
/**
*
*/
private int mState;
/**
*
*
*
*
*/
public static final int STATE_RESET = -1;
public static final int STATE_PREPARE = 0;
public static final int STATE_BEGIN = 1;
public static final int STATE_FINISH = 2;
public TmallRefreshHeader(Context context) {
this(context, null);
}
public TmallRefreshHeader(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TmallRefreshHeader(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
/**
* view
*/
private void initView() {
View view = LayoutInflater.from(getContext()).inflate(R.layout.tmall_refresh_header_view, this, false);
mTvRemind = (TextView) view.findViewById(R.id.tv_remind);
SimpleDraweeView sdv = (SimpleDraweeView) view.findViewById(R.id.tm_logo);
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
.setAutoPlayAnimations(true)
// uri, gif
.setUri(Uri.parse("res://" + getContext().getPackageName() + "/" + R.drawable.tm_mui_bike))// uri
.build();
sdv.setController(draweeController);
addView(view);
}
@Override
public void onUIReset(PtrFrameLayout frame) {
mState = STATE_RESET;
}
@Override
public void onUIRefreshPrepare(PtrFrameLayout frame) {
mState = STATE_PREPARE;
}
@Override
public void onUIRefreshBegin(PtrFrameLayout frame) {
mState = STATE_BEGIN;
}
@Override
public void onUIRefreshComplete(PtrFrameLayout frame) {
mState = STATE_FINISH;
}
@Override
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {
//
switch (mState) {
case STATE_PREPARE:
if (ptrIndicator.getCurrentPercent() < 1) {
mTvRemind.setText(" ");
} else {
mTvRemind.setText(" ");
}
break;
case STATE_BEGIN:
mTvRemind.setText(" ...");
break;
case STATE_FINISH:
mTvRemind.setText(" ...");
break;
}
}
}
효과 도 는 다음 과 같다.마지막 으로 github 주소 첨부:
https://github.com/shineflower/JdTmallPullToRefresh
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.