控件代码:
package com.invt.imarsphoneexpert.common.view; import android.content.Context; import android.util.AttributeSet; import android.widget.ImageView; import android.widget.LinearLayout; import com.invt.imarsphoneexpert.R; import java.util.ArrayList; import java.util.List; /** * Created by xl on 2018/3/12. */ public class HorizontalArrowView extends LinearLayout { private final static String TAG = HorizontalArrowView.class.getSimpleName(); private Context mContext; //默认图片宽高 private int mImgWidth; //HorizontalArrowView控件宽度 private int mWidth; //当前箭头位置 private int mPosition = -1; //子控件ImageView列表 private List<ImageView> mImageViews = new ArrayList<ImageView>(); public HorizontalArrowView(Context context) { super(context); mContext = context; init(); } public HorizontalArrowView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; init(); } public HorizontalArrowView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; init(); } /** * 初始化 */ private void init() { this.post(new Runnable() { @Override public void run() { mWidth = getWidth(); mImgWidth = getHeight(); initAnim(); } }); } /** * 初始化动画 */ private void initAnim() { //背景箭头个数 int count = mWidth / mImgWidth; //添加新的子控件 for (int i = 0; i < count; i++) { //动态生成Imageview控件 ImageView img = new ImageView(mContext); img.setLayoutParams(new LayoutParams(mImgWidth, mImgWidth)); img.setImageResource(R.drawable.remote_arrow_hb); img.setScaleType(ImageView.ScaleType.FIT_CENTER); //添加到list mImageViews.add(img); //添加到layout addView(img); } } /** * 开始动画 */ public int startAnim() { //循环移动 mPosition++; if (mPosition == mImageViews.size()) { mPosition = -1; } //更新子控件 for (int i = 0; i < mImageViews.size(); i++) { ImageView img = mImageViews.get(i); if (i == mPosition) { img.setImageResource(R.drawable.remote_arrow_ht); if (i > 2) { mImageViews.get(i - 1).setImageResource(R.drawable.remote_arrow_ht); mImageViews.get(i - 2).setImageResource(R.drawable.remote_arrow_ht); } } else { img.setImageResource(R.drawable.remote_arrow_hb); } } return mPosition; } /** * 设置当前箭头的位置 */ public void initPosition() { mPosition = -1; } }
布局文件:
<com.invt.imarsphoneexpert.common.view.HorizontalArrowView android:id="@+id/arrow" android:layout_width="100dp" android:layout_height="8dp" android:layout_marginLeft="30dp"/>
Activity:
private HorizontalArrowView mArrow; private Handler mHandler;
mArrow = (HorizontalArrowView) mView.findViewById(R.id.arrow);
mHandler = new Handler(){ @Override public void handleMessage(Message msg) { mArrow.startAnim(); } }; new Thread(new Runnable() { @Override public void run() { int count = 10000; while(count-- > 0){ mHandler.sendEmptyMessage(0); try{ Thread.sleep(50); }catch (Exception e){ } } } }).start();
以上即可以实现gif动画效果
下边是垂直gif动画代码
package com.invt.imarsphoneexpert.common.view; import android.content.Context; import android.util.AttributeSet; import android.widget.ImageView; import android.widget.LinearLayout; import com.invt.imarsphoneexpert.R; import java.util.ArrayList; import java.util.List; /** * Created by xl on 2018/3/12. */ public class VerticalArrowView extends LinearLayout { private final static String TAG = VerticalArrowView.class.getSimpleName(); private Context mContext; //默认图片宽高 private int mImgWidth; //HorizontalArrowView控件高度 private int mHeight; //当前箭头位置 private int mPosition = -1; //子控件ImageView列表 private List<ImageView> mImageViews = new ArrayList<ImageView>(); //箭头默认false朝下,true朝上 private boolean mModel = false; public VerticalArrowView(Context context) { super(context); mContext = context; init(); } public VerticalArrowView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; init(); } public VerticalArrowView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; init(); } /** * 初始化 */ private void init() { //垂直布局 this.setOrientation(VERTICAL); this.post(new Runnable() { @Override public void run() { mHeight = getHeight(); mImgWidth = getWidth(); initAnim(); } }); } /** * 初始化动画 */ private void initAnim() { //背景箭头个数 int count = mHeight / mImgWidth; //添加新的子控件 for (int i = 0; i < count; i++) { //动态生成Imageview控件 ImageView img = new ImageView(mContext); img.setLayoutParams(new LayoutParams(mImgWidth, mImgWidth)); if (mModel) { img.setImageResource(R.drawable.remote_arrow_vb_up); } else { img.setImageResource(R.drawable.remote_arrow_vb_down); } img.setScaleType(ImageView.ScaleType.FIT_CENTER); //添加到list mImageViews.add(img); //添加到layout addView(img); } } /** * 开始动画 */ public int startAnim() { //循环移动 mPosition++; if (mPosition == mImageViews.size()) { mPosition = -1; } //更新子控件 if (mModel) { for (int i = 0; i < mImageViews.size(); i++) { ImageView img = mImageViews.get(mImageViews.size() - 1 - i); if (i == mPosition) { img.setImageResource(R.drawable.remote_arrow_vt_up); if (i >= 2) { mImageViews.get(mImageViews.size() - i).setImageResource(R.drawable.remote_arrow_vt_up); mImageViews.get(mImageViews.size() + 1 - i).setImageResource(R.drawable.remote_arrow_vt_up); } } else { img.setImageResource(R.drawable.remote_arrow_vb_up); } } } else { for (int i = 0; i < mImageViews.size(); i++) { ImageView img = mImageViews.get(i); if (i == mPosition) { img.setImageResource(R.drawable.remote_arrow_vt_down); if (i >= 2) { mImageViews.get(i - 1).setImageResource(R.drawable.remote_arrow_vt_down); mImageViews.get(i - 2).setImageResource(R.drawable.remote_arrow_vt_down); } } else { img.setImageResource(R.drawable.remote_arrow_vb_down); } } } return mPosition; } /** * 设置当前箭头的位置 */ public void initPosition() { mPosition = -1; } /** * 设置箭头模式,朝上或者朝下 * * @param upordown */ public void setAnimModel(boolean upordown) { this.mModel = upordown; for (int i = 0; i < mImageViews.size(); i++) { ImageView img = mImageViews.get(i); if (mModel) { img.setImageResource(R.drawable.remote_arrow_vb_up); } else { img.setImageResource(R.drawable.remote_arrow_vb_down); } } } }
水平+垂直动画联动:
/** * 开始动画 */ private void startAnim() { if (!mAnimFlags[0]) { int position = mArrowHors[0].startAnim(); if (position == -1) { mAnimFlags[0] = true; } } else { int position = mArrowVers[0].startAnim(); if (position == -1) { mAnimFlags[0] = false; } } mArrowHors[1].startAnim(); if (!mAnimFlags[1]) { int position = mArrowHors[2].startAnim(); if (position == -1) { mAnimFlags[1] = true; } } else { int position = mArrowVers[1].startAnim(); if (position == -1) { mAnimFlags[1] = false; } } mArrowHors[3].startAnim(); if (!mAnimFlags[2]) { int position = mArrowHors[4].startAnim(); if (position == -1) { mAnimFlags[2] = true; } } else { int position = mArrowVers[2].startAnim(); if (position == -1) { mAnimFlags[2] = false; } } }完!!!