[android]代码库
package com.yx.straightline.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class ScaleImageView extends ImageView {
private ImageChangeListener imageChangeListener ;
private boolean scaleToWidth = false; // this flag determines if should measure height manually dependent of width
public ScaleImageView(Context context) {
super(context);
init();
}
public ScaleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public ScaleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init(){
this.setScaleType(ScaleType.CENTER_INSIDE);
}
@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
if (imageChangeListener != null)
imageChangeListener.changed((bm == null));
}
@Override
public void setImageDrawable(Drawable d) {
super.setImageDrawable(d);
if (imageChangeListener != null)
imageChangeListener.changed((d == null));
}
@Override
public void setImageResource(int id){
super.setImageResource(id);
}
public interface ImageChangeListener {
// a callback for when a change has been made to this imageView
void changed(boolean isEmpty);
}
public ImageChangeListener getImageChangeListener() {
return imageChangeListener ;
}
public void setImageChangeListener(ImageChangeListener imageChangeListener) {
this.imageChangeListener = imageChangeListener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
/**
* if both width and height are set scale width first. modify in future if necessary
*/
if(widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST ){
scaleToWidth = true ;
} else if (heightMode == MeasureSpec.EXACTLY || heightMode == MeasureSpec.AT_MOST ){
scaleToWidth = false ;
} else throw new IllegalStateException("width or height needs to be set to match_parent or a specific dimension");
if(getDrawable()==null || getDrawable().getIntrinsicWidth()==0 ){
// nothing to measure
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
} else{
if(scaleToWidth ){
int iw = this .getDrawable().getIntrinsicWidth();
int ih = this .getDrawable().getIntrinsicHeight();
int heightC = width*ih/iw;
if(height > 0)
if(heightC>height){
// dont let hegiht be greater then set max
heightC = height;
width = heightC*iw/ih;
}
this.setScaleType(ScaleType.CENTER_CROP);
setMeasuredDimension(width, heightC);
} else{
// need to scale to height instead
int marg = 0;
if(getParent()!=null){
if(getParent().getParent()!=null){
marg+= ((RelativeLayout) getParent().getParent()).getPaddingTop();
marg+= ((RelativeLayout) getParent().getParent()).getPaddingBottom();
}
}
int iw = this .getDrawable().getIntrinsicWidth();
int ih = this .getDrawable().getIntrinsicHeight();
width = height*iw/ih;
height-=marg;
setMeasuredDimension(width, height);
}
}
}
}
知识点:
MeasureSpec.EXACTLY
MeasureSpec.AT_MOST
MeasureSpec.UNSPECIFIED
MeasureSpec.getMode方法和MeasureSpec.getSize方法
初级程序员
by: 云代码会员 发表于:2015-06-19 15:21:47 顶(0) | 踩(0) 回复
不错
回复评论