Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的自定义视图,缩放不起作用_Android_Android View_Android Custom View - Fatal编程技术网

Android上的自定义视图,缩放不起作用

Android上的自定义视图,缩放不起作用,android,android-view,android-custom-view,Android,Android View,Android Custom View,我正在尝试创建一个具有缩放功能的自定义视图,但它在我下面的代码中没有显示任何内容。因为我在这里要求它是我当前缩放位图的方式,请注意,我正在寻找另一种缩放整个画布的方法。下面是我的onDraw()方法的细节,但是full方法在项目放置方面有更多的逻辑,在缩放之前,如果用户选择了缩放,我会检查一个布尔标志,但我想你不想筛选那么多代码,所以我只在这里放一些相关的东西 private final int bgColor = 8355711; private Paint paint; private Bi

我正在尝试创建一个具有缩放功能的自定义视图,但它在我下面的代码中没有显示任何内容。因为我在这里要求它是我当前缩放位图的方式,请注意,我正在寻找另一种缩放整个画布的方法。下面是我的onDraw()方法的细节,但是full方法在项目放置方面有更多的逻辑,在缩放之前,如果用户选择了缩放,我会检查一个布尔标志,但我想你不想筛选那么多代码,所以我只在这里放一些相关的东西

private final int bgColor = 8355711;
private Paint paint;
private Bitmap bgBitmap;
private float scaleFactor = 1;
private final float minScaleFactor = 0.25f, maxScaleFactor = 10f;
private ScaleGestureDetector scaleDetector;

public OratorView(Context context) {
    super(context, null, 0);
//  init(context);
}

public OratorView(Context context, AttributeSet set) {
    super(context, set, 0);
    init(context);
}

public OratorView(Context context, AttributeSet set, int defStyle) {
    super(context, set, defStyle);
    init(context);
}

private void init(Context context) {
    if (null == scaleDetector)
        this.scaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    this.paint = new Paint();
    this.paint.setColor(bgColor);
}

public void setBackground(Bitmap bitmap) {
    this.bgBitmap = bitmap;
    bgScaled = false;
}

private boolean bgScaled = false;

private void scaleBg() {
    if (null != bgBitmap) {
        if (bgBitmap.getWidth() > 0 && bgBitmap.getHeight() > 0) {
            float widthFactor = (float) bgBitmap.getWidth() / (float) getWidth();
            float heightFactor = (float) bgBitmap.getHeight() / (float) getHeight();
            float scale = widthFactor > heightFactor ? widthFactor : heightFactor;
            bgBitmap = Bitmap.createScaledBitmap(bgBitmap, (int) (bgBitmap.getWidth() / scale), (int) (bgBitmap.getHeight() / scale),
                    true);
            bgScaled = true;
        }
        invalidate();
    }
}

@Override
public void onDraw(Canvas c) {
    super.onDraw(c);
    c.save();
    c.scale(scaleFactor, scaleFactor);
    // fill background with solid color
    c.drawColor(bgColor);

    if (!bgScaled) {
        scaleBg();
    }
    // draw background image if any
    if (null != bgBitmap) {
        c.drawBitmap(bgBitmap, (getWidth() - bgBitmap.getWidth()) / 2, (getHeight() - bgBitmap.getHeight()) / 2, paint);
    }
    c.restore();
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    scaleDetector.onTouchEvent(ev);
    return true;
}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        scaleFactor *= detector.getScaleFactor();
        Log.d("OratorView", "onScale - scaleFactor=" + scaleFactor);
        if (scaleFactor >= maxScaleFactor && scaleFactor <= maxScaleFactor) {
            scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 5.0f));
            invalidate();
        }
        return true;
    }
}
private final int bgColor=8355711;
私人油漆;
私有位图;
私有浮点scaleFactor=1;
私人最终浮动系数=0.25f,最大浮动系数=10f;
专用scalegestruedetector scaleDetector;
公共演讲视图(上下文){
super(上下文,null,0);
//init(上下文);
}
公共演讲视图(上下文、属性集){
super(上下文,set,0);
init(上下文);
}
公共演讲视图(上下文、属性集、int-defStyle){
超级(上下文、集合、定义样式);
init(上下文);
}
私有void init(上下文){
if(null==scaleDetector)
this.scaleDetector=新的scalegestruedetector(上下文,新的ScaleListener());
this.paint=新油漆();
this.paint.setColor(bgColor);
}
公共空白背景(位图){
this.bgp位图=位图;
bgScaled=false;
}
私有布尔值=false;
私有void scaleBg(){
如果(null!=BG位图){
if(bgpramit.getWidth()>0&&bgpramit.getHeight()>0){
float widthFactor=(float)bgp位图.getWidth()/(float)getWidth();
float heightFactor=(float)bgp位图.getHeight()/(float)getHeight();
浮动比例=宽度因子>高度因子?宽度因子:高度因子;
bgBitmap=Bitmap.createScaledBitmap(bgBitmap,(int)(bgBitmap.getWidth()/scale),(int)(bgBitmap.getHeight()/scale),
正确的);
bgScaled=true;
}
使无效();
}
}
@凌驾
公共空白onDraw(画布c){
super.onDraw(c);
c、 save();
c、 scale(scaleFactor,scaleFactor);
//用纯色填充背景
c、 drawColor(bgColor);
如果(!bgScaled){
scaleBg();
}
//绘制背景图像(如有)
如果(null!=BG位图){
c、 drawBitmap(bgBitmap,(getWidth()-bgBitmap.getWidth())/2,(getHeight()-bgBitmap.getHeight())/2,绘制);
}
c、 恢复();
}
@凌驾
公共事件(MotionEvent ev){
定标检测器。开闭式排气阀(ev);
返回true;
}
私有类ScaleListener扩展了scalegestruedetector.SimpleOnScalegestrueListener{
@凌驾
公共布尔标度(scalegestruedetector检测器){
scaleFactor*=检测器。getScaleFactor();
Log.d(“OratorView”,“onScale-scaleFactor=“+scaleFactor”);

如果(scaleFactor>=maxScaleFactor&&scaleFactor,我相信问题出在ScaleListener.onScale方法中。这就是我所说的代码块:

 if (scaleFactor >= maxScaleFactor && scaleFactor <= maxScaleFactor) {
          scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 5.0f));
          invalidate();
 }
scaleFactor = detector.getScaleFactor();