안 드 로 이 드 사용자 정의 새해 불꽃놀이,축복 어 배 너 애니메이션 보기
다음 효과 그림:
제 가 실현 하 는 과정 에서 플래카드 의 재단 계산 은 비교적 오래 걸 렸 습 니 다.초판 은 속성 애니메이션 으로 float 의 비율 치 를 계산 하여 각 프레임 의 재단 에 맞 춰 다음 과 같은 코드 를 그 렸 습 니 다.
private static class RollView extends View {
private Bitmap mBitmap;
private Rect mSrc;
private Rect mDst;
private int mRollWidth = 60;
private float mRate;
private boolean mIsStopAnim;
public RollView(Context context) {
super(context);
mSrc = new Rect();
mDst = new Rect();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
if (mBitmap == null) return;
drawFromMiddleByFloatCompute(canvas);
}
private void drawFromMiddleByFloatCompute(Canvas canvas) {
/*
src mBitmap. ,, drawable
, view drawable
*/
final float rate = mRate;
mSrc.left = 0;
mSrc.top = 0;
mSrc.right = mRollWidth;
mSrc.bottom = mBitmap.getHeight();
mDst.left = (int) ((getWidth() / 2 - mRollWidth) - (getWidth() / 2 - mRollWidth) * rate);
mDst.top = 0;
mDst.right = mDst.left + mRollWidth + 1;// , +1
mDst.bottom = getHeight();
canvas.drawBitmap(mBitmap, mSrc, mDst, null);
//
int sw = (int) ((mBitmap.getWidth() - mRollWidth * 2) * rate);
mSrc.left = mBitmap.getWidth() / 2 - sw / 2;
mSrc.top = 0;
mSrc.right = mSrc.left + sw;
mSrc.bottom = mBitmap.getHeight();
int dw = (int) ((getWidth() - mRollWidth * 2) * rate);
mDst.left = getWidth() / 2 - dw / 2;
mDst.top = 0;
mDst.right = mDst.left + dw;
mDst.bottom = getHeight();
canvas.drawBitmap(mBitmap, mSrc, mDst, null);
//
mSrc.left = mBitmap.getWidth() - mRollWidth;
mSrc.top = 0;
mSrc.right = mBitmap.getWidth();
mSrc.bottom = mBitmap.getHeight();
mDst.left = (int) (getWidth() / 2 + (getWidth() / 2 - mRollWidth) * rate);
mDst.top = 0;
mDst.right = mDst.left + mRollWidth;
mDst.bottom = getHeight();
canvas.drawBitmap(mBitmap, mSrc, mDst, null);
}
public void setRes(int resId) {
mBitmap = getBitmapFromLocal(resId);
}
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
public void startFloatComputeAnim() {
/*
float , , Rect ,
float to int , :1 px
*/
ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (mIsStopAnim) {
animation.cancel();
return;
}
mRate = (float) animation.getAnimatedValue();
invalidate();
}
});
animator.setDuration(2000);
animator.start();
}
public void stopAnim() {
mIsStopAnim = true;
}
}
>float 회전 int 에 정밀도 손실 문제 가 있 기 때문에 계산 에 1px(코드 에 있 음)를 강제로 추가 합 니 다.이렇게 하면 1px 가 그리 지 않 은 문 제 를 해 결 했 지만 그리 기 가 부 드 럽 지 않 고 떨 리 는 상황 이 발생 할 수 있 습 니 다(일부 devices 에서)
그 러 니까 플 로 트 로 계산 하지 않 는 게 좋 을 것 같 아 요.
>나중에 동료 들 은 고정 int 값 을 사용 하여 계산 에 참여 하면 상기 문 제 를 해결 할 수 있 을 것 이 라 고 추측 했다.
예 를 들 어 초당 30 프레임,여기 애니메이션 시간 은 2 초,즉 총 30*2=60 프레임 이다.
그림 너비,왼쪽 족자,오른쪽 족자 맞다. 60 프레임 수 는 해당 하 는 나눗셈 과 다른 계산 을 하면 한 프레임 에서 그들 이 운동 해 야 할 x 거 리 를 얻 을 수 있다.
>그 다음 에 저 는 속성 애니메이션 을 사용 하여 0 에서 getWidth()사이 의 애니메이션 값 을 계산 하고
따라서 계산 을 통 해 플래카드 를 왼쪽 에서 오른쪽으로 떼 면 다음 과 같다.
코드 가 전체적으로 오픈 되 지 않 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.