안 드 로 이 드 사용자 정의 뷰 알 리 페 이<unk><unk>효과 구현
실현 방향 은 매우 간단 하 다.
반투명 원 을 그리다.
4.567917.두 가지 애니메이션 효 과 를 실현 하고 클릭 시 확산 과 클릭 하지 않 을 때 확산 회수4.567917.스 레 드 방식 으로 위의 두 단 계 를 결합 시킨다.
일단 반투명 원 을 그 리 는 부분 을 볼 게 요.
public class ClickCircleView extends View {
private Bitmap bitmap;
private Paint paint;
private Canvas canvas;
private boolean isSpreadFlag = false;//
public boolean isSpreadFlag() {
return isSpreadFlag;
}
public void setIsSpreadFlag(boolean isSpreadFlag) {
this.isSpreadFlag = isSpreadFlag;
}
public ClickCircleView(Context context, int width, int height, int screenWidth, int screenHeight) {
super(context);
bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); //
canvas = new Canvas();
canvas.setBitmap(bitmap);
paint = new Paint(Paint.DITHER_FLAG);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.FILL);
paint.setAlpha(50);
canvas.drawCircle(screenWidth / 2, screenHeight / 2, width / 2 + 10, paint);
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap, 0, 0, null);
}
}
관련 속성 이 모두 화필 에 설 치 된 것 을 볼 수 있 습 니 다.그리고 캔버스 의 drawCircle()방법 으로 반투명 원 을 그리고 마지막 으로 invalidate()방법 으로 View 를 새로 고 칩 니 다.부모 클래스 의 onDraw()방법 을 다시 써 야 합 니 다.그렇지 않 으 면 사용자 정의 View 가 유효 하지 않 습 니 다.
우 리 는 애니메이션 의 완성 여 부 를 표시 하 는 표지 위치 isSpreadFlag 을 설정 했다.
그리고 저희 가 두 개의 애니메이션 효 과 를 실현 하도록 하 겠 습 니 다.
클릭 시 애니메이션 확산
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="1000"
android:propertyName="scaleY"
android:valueFrom="1.0"
android:valueTo="1.8"
android:valueType="floatType" />
<objectAnimator
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1.0"
android:valueTo="1.8"
android:valueType="floatType" />
</set>
간단 하 다.scale 값 을 바 꾸 어 1.8 배로 늘 리 는 것 이다.클릭 하지 않 을 때 재 활용 애니메이션 확산
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1.0"
android:valueTo="1.2"
android:valueType="floatType" />
<objectAnimator
android:duration="1000"
android:propertyName="scaleY"
android:valueFrom="1.0"
android:valueTo="1.2"
android:valueType="floatType" />
<objectAnimator
android:duration="1000"
android:propertyName="scaleX"
android:startOffset="1000"
android:valueFrom="1.2"
android:valueTo="1.0"
android:valueType="floatType" />
<objectAnimator
android:duration="1000"
android:propertyName="scaleY"
android:startOffset="1000"
android:valueFrom="1.2"
android:valueTo="1.0"
android:valueType="floatType" />
</set>
이전 애니메이션 과 유사 합 니 다.startOffset 인 자 는 Animation 의 실행 순 서 를 제어 할 수 있 습 니 다.예 를 들 어 Android:startOffset="1000"은 이 속성 을 설정 한 애니메이션 의 실행 지연 을 1 초 로 표시 합 니 다.그리고 애니메이션 과 논 리 를 스 레 드 로 수행 하 는 부분 입 니 다.
클릭 하지 않 을 때의 애니메이션 부분
mXiuyixiuButton.post(new Runnable() {
@Override
public void run() {
clickCircleView = new ClickCircleView(CustomView1.this, mXiuyixiuButton.getWidth()
, mXiuyixiuButton.getHeight(), mXiuyixiuLayout.getMeasuredWidth(),
mXiuyixiuLayout.getMeasuredHeight());
clickCircleView.setVisibility(View.VISIBLE);
mXiuyixiuLayout.addView(clickCircleView);
mXiuyixiuLayout.postInvalidate();
//
final Animator anim = AnimatorInflater.loadAnimator(CustomView1.this,
R.animator.circle_scale_animator);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (anim != null) {
anim.start();//
}
}
});
anim.setTarget(clickCircleView);
anim.start();
}
});
clickCircleView 를 초기 화 한 후 이 view 를 부모 레이아웃 에 추가 한 다음 애니메이션 을 불 러 오고 순환 실행 을 설정 합 니 다.마지막 으로 post Invaidate()를 사용 하여 하위 스 레 드 에서 view 를 새로 고 칩 니 다.클릭 한 애니메이션 부분
mXiuyixiuButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickCircleView.setVisibility(View.GONE);// , View
final ClickCircleView item = new ClickCircleView(CustomView1.this, mXiuyixiuButton.getWidth()
, mXiuyixiuButton.getHeight(), mXiuyixiuLayout.getWidth(),
mXiuyixiuLayout.getHeight());
Animator spreadAnim = AnimatorInflater.loadAnimator(CustomView1.this,
R.animator.circle_spread_animator);
spreadAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
item.setIsSpreadFlag(true);// ,
}
});
spreadAnim.setTarget(item);
spreadAnim.start();
clickCircleViewList.add(item);
mXiuyixiuLayout.addView(item);
mXiuyixiuLayout.invalidate();
handler.post(circleViewRunnable);
}
});
클릭 하지 않 은 애니메이션 을 숨 기 고 ClickCircleView 를 초기 화한 후 이 view 를 List 에 추가 하고 부모 레이아웃 에 추가 한 다음 애니메이션 을 불 러 오고 애니메이션 이 끝 날 때 isSpreadFlag 표 시 를 추가 합 니 다.마지막 으로 invalidate()방법 으로 view 를 새로 고치 고 스 레 드 를 엽 니 다.스 레 드 부분
private Runnable circleViewRunnable = new Runnable() {
public void run() {
for (int i = 0; i < clickCircleViewList.size(); i++) {
if (clickCircleViewList.get(i).isSpreadFlag()) {
mXiuyixiuLayout.removeView(clickCircleViewList.get(i));
clickCircleViewList.remove(i);
mXiuyixiuLayout.postInvalidate();
}
}
if (clickCircleViewList.size() <= 0) {
clickCircleView.setVisibility(View.VISIBLE);
}
handler.postDelayed(this, 100);
}
};
list 를 옮 겨 다 니 며 isSpreadFlag 표 시 된 view 를 list 와 부모 레이아웃 에서 제거 하고 view 를 새로 고 칩 니 다.마지막 으로 list 가 비어 있 으 면 클릭 하지 않 을 때의 애니메이션 을 표시 합 니 다.마지막 으로 onDestroy()에서 스 레 드 를 제거 하 는 것 을 기억 하 세 요.
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacks(circleViewRunnable);
}
사용자 정의 View 를 사용 하여 속성 애니메이션 과 결합 하여 이 효 과 를 실현 하 는 것 이 비교적 높 습 니 다.다만 이러한 방식 은 사용자 정의 View 를 완전히 사용 하 는 것 보다 더욱 유창 합 니 다.이 방식 은 대부분 다른 사람의 블 로그 에 있 는 코드 를 참고 하여 이 루어 집 니 다.그러나 단지 정리 하지 않 고 사용 하 는 것 만 으로 는 자신의 지식 이 될 수 없 기 때문에 이 블 로 그 를 가지 게 되 었 습 니 다.참고:안 드 로 이 드 가 알 리 페 이 를 실현 하 는 몇 가지 사고방식
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.