最近有这么个需求看图如下:
要求船动 ,波动,船随波动
实际实现效果如下,勉强通过
分析解决方案:
1:做成帧动画,发现切了200多张图,我也是醉了,为了避免OOM,崩溃的原因,舍弃,再说图片将近40M
2:做成MP4,播放视频发现,小了许多8M,呵呵,但是依旧很大,再尝试的过程中,避免不了视频初始化加载会黑一下,或闪一下的问题,舍弃
3:最后只能采用绘制
于是网上各种搜索,各种学习开始了:
1:先实现一条波,并让其波动
package test.vko.cn.ttapplication.weight;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
import test.vko.cn.ttapplication.R;
/**
* Created by JiaRH on 2015/11/19.
*/
public class ShipWaveView extends View {
Paint mPaint;
private int color = Color.parseColor("#50378DCC");
private int viewWidth;
private int viewHeight;
private int WAVE_HEIGHT = 40;
private List<PointF> mPointsList;
private int mWaveWidth = 350;
private int mLevelLine;
private Path mWavePath;
private boolean isMeasured;
/**
* 记录当前运动点的位置
*/
private float[] mCurrentPosition = new float[2];
private PathMeasure mPathMeature;
Bitmap boat;
ValueAnimator valueAnimator;
private int speed = 3;
private int moveLen = 0;
public ShipWaveView(Context context) {
this(context, null);
}
public ShipWaveView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ShipWaveView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initData(context);
initPaint();
}
private void initData(Context context) {
mPointsList = new ArrayList<>();
boat = BitmapFactory.decodeResource(getResources(), R.drawable.boat1);
}
private void initPaint() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStrokeWidth(1.5f);
mPaint.setStyle(Paint.Style.FILL);
mWavePath = new Path();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// int withSize = MeasureSpec.getSize(widthMeasureSpec);
// int heightSize = MeasureSpec.getSize(heightMeasureSpec);
// int withMode = MeasureSpec.getMode(widthMeasureSpec);
// int heightMode = MeasureSpec.getMode(heightMeasureSpec);
// if(withMode==MeasureSpec.AT_MOST&&heightMode==MeasureSpec.AT_MOST){
// withSize = getMeasuredWidth();
// }
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected vo