如何在android中缩放自定义图像视图?
在我的face detector项目中,我使用自定义ImageView(MyView)来检测人脸并在检测到的人脸上绘制矩形。为此,我为我的customview(MyView)设置了固定尺寸,并尝试缩放位图以适应customview。但不知何故,我无法做到这一点。 在这方面,我已经回答了所有类似的问题。请帮忙 activity_main.xml如何在android中缩放自定义图像视图?,android,android-imageview,android-custom-view,android-bitmap,android-custom-attributes,Android,Android Imageview,Android Custom View,Android Bitmap,Android Custom Attributes,在我的face detector项目中,我使用自定义ImageView(MyView)来检测人脸并在检测到的人脸上绘制矩形。为此,我为我的customview(MyView)设置了固定尺寸,并尝试缩放位图以适应customview。但不知何故,我无法做到这一点。 在这方面,我已经回答了所有类似的问题。请帮忙 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.sample.facedetector.MyView
android:layout_width="300dp"
android:layout_height="300dp"
android:id="@+id/MyViewId"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="28dp"
android:scaleType="centerCrop"/>
MyView
package com.sample.facedetector;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.support.annotation.DrawableRes;
import android.util.AttributeSet;
import android.widget.ImageView;
public class MyView extends ImageView {
private Bitmap mFaceBitmap;
private int count = 0;
private FaceDetector.Face[] faces;
private Bitmap image;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void detectFaces(){
FaceDetector myFaceDetector = null;
mFaceBitmap = image.copy(Bitmap.Config.RGB_565, true);
int targetWidth = mFaceBitmap.getWidth();
int targetHeight = mFaceBitmap.getHeight();
faces= new FaceDetector.Face[5];
int[] fpx =null;
int[] fpy = null;
myFaceDetector = new FaceDetector(targetWidth,targetHeight,5);
count = myFaceDetector.findFaces(mFaceBitmap, faces);
setWillNotCacheDrawing(true);
requestLayout();
this.invalidate();
}
/*@Override
public void setScaleType(ScaleType scaleType) {
super.setScaleType(ScaleType.CENTER);
invalidate();
}*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(mFaceBitmap,0,0,null);
Paint myPaint = new Paint();
myPaint.setColor(Color.GREEN);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeWidth(3);
if (count > 0) {
for (int i = 0; i < count; i++) {
FaceDetector.Face face = faces[i];
PointF midPoint = new PointF();
face.getMidPoint(midPoint);
float eyeDistance = face.eyesDistance();
canvas.drawRect(midPoint.x-eyeDistance, midPoint.y-eyeDistance, midPoint.x+eyeDistance, midPoint.y+eyeDistance, myPaint);
}
}
}
@Override
public void setImageResource(@DrawableRes int resId) {
super.setImageResource(resId);
invalidate();
}
public void setImage(Bitmap image) {
this.image = image;
}
package com.sample.facedetector;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.PointF;
导入android.media.FaceDetector;
导入android.support.annotation.DrawableRes;
导入android.util.AttributeSet;
导入android.widget.ImageView;
公共类MyView扩展了ImageView{
私有位图;
私有整数计数=0;
私人面部检测器。面部[]面部;
私有位图图像;
公共MyView(上下文、属性集属性){
超级(上下文,attrs);
}
公共MyView(上下文){
超级(上下文);
}
公共MyView(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
公共void detectFaces(){
FaceDetector myFaceDetector=null;
mFaceBitmap=image.copy(Bitmap.Config.RGB_565,true);
int targetWidth=MFACE位图.getWidth();
int-targetHeight=mFaceBitmap.getHeight();
面=新的面检测器。面[5];
int[]fpx=null;
int[]fpy=null;
myFaceDetector=新的FaceDetector(targetWidth,targetLight,5);
count=myFaceDetector.findFaces(MFACE位图,面);
setWillNotCacheDrawing(真);
requestLayout();
这个。使无效();
}
/*@凌驾
public void setScaleType(ScaleType ScaleType){
super.setScaleType(ScaleType.CENTER);
使无效();
}*/
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
drawBitmap(mFaceBitmap,0,0,null);
绘制myPaint=新绘制();
myPaint.setColor(颜色.绿色);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.设置行程宽度(3);
如果(计数>0){
for(int i=0;i
}
package com.sample.facedetector;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.support.annotation.DrawableRes;
import android.util.AttributeSet;
import android.widget.ImageView;
public class MyView extends ImageView {
private Bitmap mFaceBitmap;
private int count = 0;
private FaceDetector.Face[] faces;
private Bitmap image;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void detectFaces(){
FaceDetector myFaceDetector = null;
mFaceBitmap = image.copy(Bitmap.Config.RGB_565, true);
int targetWidth = mFaceBitmap.getWidth();
int targetHeight = mFaceBitmap.getHeight();
faces= new FaceDetector.Face[5];
int[] fpx =null;
int[] fpy = null;
myFaceDetector = new FaceDetector(targetWidth,targetHeight,5);
count = myFaceDetector.findFaces(mFaceBitmap, faces);
setWillNotCacheDrawing(true);
requestLayout();
this.invalidate();
}
/*@Override
public void setScaleType(ScaleType scaleType) {
super.setScaleType(ScaleType.CENTER);
invalidate();
}*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(mFaceBitmap,0,0,null);
Paint myPaint = new Paint();
myPaint.setColor(Color.GREEN);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeWidth(3);
if (count > 0) {
for (int i = 0; i < count; i++) {
FaceDetector.Face face = faces[i];
PointF midPoint = new PointF();
face.getMidPoint(midPoint);
float eyeDistance = face.eyesDistance();
canvas.drawRect(midPoint.x-eyeDistance, midPoint.y-eyeDistance, midPoint.x+eyeDistance, midPoint.y+eyeDistance, myPaint);
}
}
}
@Override
public void setImageResource(@DrawableRes int resId) {
super.setImageResource(resId);
invalidate();
}
public void setImage(Bitmap image) {
this.image = image;
}