Android 는 상품 을 카 트 에 추가 하 는 애니메이션 효과(베 어 셀 곡선)
구현 효 과 는 그림:
생각:
애니메이션 의 시작 점 을 확정 합 니 다
PathMeasure 사용
- getLength()
-boolean getPosTan(float distance,float[]pos,float[]tan)의 이해
관련 된 지식 포인트:
화면 에 있 는 컨트롤 의 절대 좌 표를 가 져 오 는 방법
// ( / )
int[] parentLocation = new int[2];
rl.getLocationInWindow(parentLocation);
베 어 셀 곡선 및 속성 애니메이션 플러그 인 ValueAnimator 를 어떻게 사용 합 니까?
// 、 ( )( )
//
Path path = new Path();
// ( )
path.moveTo(startX, startY);
// : , ,
path.quadTo((startX + toX) / 2, startY, toX, toY);
//mPathMeasure ,
// true,path
mPathMeasure = new PathMeasure(path, false);
//★★★ ( 0 , )
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
valueAnimator.setDuration(1000);
//
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// , ,
// ( )
float value = (Float) animation.getAnimatedValue();
// ★★★★★ mCurrentPosition
// boolean getPosTan(float distance, float[] pos, float[] tan) :
// distance(0<=distance<=getLength()),
// ,pos , 。
mPathMeasure.getPosTan(value, mCurrentPosition, null);//mCurrentPosition
// ( )
goods.setTranslationX(mCurrentPosition[0]);
goods.setTranslationY(mCurrentPosition[1]);
}
});
// 、
valueAnimator.start();
모든 코드:
package cn.c.com.beziercurveanimater;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private ImageView cart;
private ArrayList<Bitmap> bitmapList = new ArrayList<>();
private RelativeLayout rl;
private PathMeasure mPathMeasure;
/**
*
*/
private float[] mCurrentPosition = new float[2];
private TextView count;
private int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initImg();
MyAdapter myAdapter = new MyAdapter(bitmapList);
mRecyclerView.setAdapter(myAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
}
private void initImg() {
bitmapList.add(BitmapFactory.decodeResource(getResources(), R.drawable.coin));
bitmapList.add(BitmapFactory.decodeResource(getResources(), R.drawable.coin1));
bitmapList.add(BitmapFactory.decodeResource(getResources(), R.drawable.coin91));
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
cart = (ImageView) findViewById(R.id.cart);
rl = (RelativeLayout) findViewById(R.id.rl);
count = (TextView) findViewById(R.id.count);
}
class MyAdapter extends RecyclerView.Adapter<MyVH> {
private ArrayList<Bitmap> bitmapList;
public MyAdapter(ArrayList<Bitmap> bitmapList) {
this.bitmapList = bitmapList;
}
@Override
public MyVH onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
View itemView = inflater.inflate(R.layout.item, parent, false);
MyVH myVH = new MyVH(itemView);
return myVH;
}
@Override
public void onBindViewHolder(final MyVH holder, final int position) {
holder.iv.setImageBitmap(bitmapList.get(position));
holder.buy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addCart(holder.iv);
}
});
}
@Override
public int getItemCount() {
return bitmapList.size();
}
}
/**
* ★★★★★ ★★★★★
* @param iv
*/
private void addCart( ImageView iv) {
// 、 ---imageview
// new imageview, imageview
// ( , , ( ), )
final ImageView goods = new ImageView(MainActivity.this);
goods.setImageDrawable(iv.getDrawable());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100, 100);
rl.addView(goods, params);
// 、 /
// ( / )
int[] parentLocation = new int[2];
rl.getLocationInWindow(parentLocation);
// ( )
int startLoc[] = new int[2];
iv.getLocationInWindow(startLoc);
// ( )
int endLoc[] = new int[2];
cart.getLocationInWindow(endLoc);
// 、 /
// : - +
float startX = startLoc[0] - parentLocation[0] + iv.getWidth() / 2;
float startY = startLoc[1] - parentLocation[1] + iv.getHeight() / 2;
// : - + 1/5
float toX = endLoc[0] - parentLocation[0] + cart.getWidth() / 5;
float toY = endLoc[1] - parentLocation[1];
// 、 ( )( )
//
Path path = new Path();
// ( )
path.moveTo(startX, startY);
// : , ,
path.quadTo((startX + toX) / 2, startY, toX, toY);
//mPathMeasure ,
// true,path
mPathMeasure = new PathMeasure(path, false);
//★★★ ( 0 , )
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
valueAnimator.setDuration(1000);
//
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// , ,
// ( )
float value = (Float) animation.getAnimatedValue();
// ★★★★★ mCurrentPosition
// boolean getPosTan(float distance, float[] pos, float[] tan) :
// distance(0<=distance<=getLength()),
// ,pos , 。
mPathMeasure.getPosTan(value, mCurrentPosition, null);//mCurrentPosition
// ( )
goods.setTranslationX(mCurrentPosition[0]);
goods.setTranslationY(mCurrentPosition[1]);
}
});
// 、
valueAnimator.start();
// 、
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
// :
@Override
public void onAnimationEnd(Animator animation) {
// 1
i++;
count.setText(String.valueOf(i));
// imageview
rl.removeView(goods);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
class MyVH extends RecyclerView.ViewHolder {
private ImageView iv;
private TextView buy;
public MyVH(View itemView) {
super(itemView);
iv = (ImageView) itemView.findViewById(R.id.iv);
buy = (TextView) itemView.findViewById(R.id.buy);
}
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.