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;
}
}
}完!!!
相关文章推荐
- android绘制自定义view时,控件大小的测量与确定问题
- Android 自定义View 测量控件大小onMeasure中MeasureSpec作用
- 【Android自定义View】测量和绘制浅析
- Android控件架构与view,viewgroup的测量和绘制
- (转)Android自定义View(三、深入解析控件测量onMeasure)
- 【Android】A星算法演示代码(自定义view方便查看效果)
- android-自定义ImageView-圆形图片绘制代码详解
- Android自定义View之自定义评价打分控件RatingBar实现自定义星星大小和间距
- 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距
- Android自定义View之自定义评价打分控件RatingBar实现自定义星星大小和间距
- Android开发中遇到的问题(一)——自定义videoview设置视频大小,实现上下黑边
- 解决Android当中GridView的Item子控件中有ImageView图片大小不一致问题
- Android 自定义view 的绘制时机 问题
- Android自定义View【实战教程】5⃣️---Canvas详解及代码绘制安卓机器人
- Android自定义View之绘制、测量
- 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距
- Android_自定义HorizontalScrollView实现滑动子控件大小伸缩
- Android自定义View(三、深入解析控件测量onMeasure)
- Android程序中代码动态设置Textview文字的大小解决px转dp的问题
- 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距