android绘制自定义view时,控件大小的测量与确定问题,代码演示

控件代码:
 
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;
        }
    }
}
完!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值