android 自定义ImageView -图片显示相关1

这个博客介绍了一个名为MatrixImageView的自定义组件,它根据控件的宽高和图片的尺寸,来决定显示图片的特定部分。例如,对于竖长图显示上半部分,横长图显示左半部分。通过设置矩阵缩放,实现了不同尺寸图片在固定大小的ImageView中适配的效果。
摘要由CSDN通过智能技术生成

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.net.Uri;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.ImageView;

import android.view.ViewTreeObserver;


import com.tancheng.laikanxing.util.MethodUtils;


/**

 * 根据显示图片的宽高,控件的宽高,决定显示图片的某一个部分,比如, 竖长图上半部分,横长图左半部分

 *

 * @author Chris Arriola

 */

public class MatrixImageViewextends ImageView {



public TopCropImageView(Contextcontext) {

super(context);

}


public TopCropImageView(Contextcontext, AttributeSetattrs) {

super(context,attrs);

}


public TopCropImageView(Contextcontext, AttributeSetattrs, int defStyle) {

super(context,attrs,defStyle);

}


@Override

protectedvoid onLayout(booleanchanged,int left,inttop,intright,

int bottom) {

super.onLayout(changed,left,top, right,bottom);


}


@Override

public void setImageMatrix(Matrix matrix) {

super.setImageMatrix(matrix);

changeMatirx(null);

}


//

@Override

protectedboolean setFrame(intl,intt,intr,intb) {

boolean result = super.setFrame(l,t,r, b);

changeMatirx(null);

returnresult;//super.setFrame(l, t, r, b);

}


@Override

public void setImageDrawable(Drawable drawable) {

super.setImageDrawable(drawable);

changeMatirx(drawable);

}


@Override

public void setImageResource(int resId) {

// TODO Auto-generated method stub

super.setImageResource(resId);

changeMatirx(getDrawable());

}


@Override

public void setImageURI(Uri uri) {

// TODO Auto-generated method stub

super.setImageURI(uri);

changeMatirx(getDrawable());

}


//

privateintdrawableWidth;

privateintdrawableHeight;


private void changeMatirx(Drawable drawable) {

if (drawable ==null) {

drawable = getDrawable();

if (drawable ==null) {

return;

}

}

drawableWidth =drawable.getIntrinsicWidth();

drawableHeight =drawable.getIntrinsicHeight();

if (drawableWidth <= 0 ||drawableHeight <= 0) {

return;

}

if (drawableHeight >drawableWidth) {

setScaleType(ScaleType.MATRIX);


} else {

setScaleType(ScaleType.CENTER_CROP);

}

}


@Override

public void setScaleType(ScaleType scaleType) {

changeMatrix(scaleType);

super.setScaleType(scaleType);


}


@Override

protectedvoid onDraw(Canvascanvas) {

super.onDraw(canvas);

}


private void changeMatrix(ScaleType scaleType) {

if (scaleType == ScaleType.MATRIX) {

final Matrixmatrix = getImageMatrix();

final int viewWidth = getWidth() - getPaddingLeft()

- getPaddingRight();

final int viewHeight = getHeight() - getPaddingTop()

- getPaddingBottom();

if (viewHeight <= 0 ||viewWidth <= 0) {

return;

}

float scale = 0f;

if (drawableWidth *viewHeight >viewWidth *drawableHeight) {

scale = (float)viewHeight / (float)drawableHeight;

} else {

scale = (float)viewWidth / (float)drawableWidth;

}

scale = (float)viewWidth / (float)drawableWidth;

matrix.setScale(scale,scale);

super.setImageMatrix(matrix);

}

}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值