如何在android中缩放自定义图像视图?

如何在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

在我的face detector项目中,我使用自定义ImageView(MyView)来检测人脸并在检测到的人脸上绘制矩形。为此,我为我的customview(MyView)设置了固定尺寸,并尝试缩放位图以适应customview。但不知何故,我无法做到这一点。 在这方面,我已经回答了所有类似的问题。请帮忙

activity_main.xml

<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;
}