您的位置:首页 > 移动开发 > Android开发

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

2018-03-13 17:45 597 查看
控件代码:
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;
}
}
}完!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐