Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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
Java 为什么Android maps compass演示为SmoothCanvas类使用委托?_Java_Android_Class_Delegates_Demo - Fatal编程技术网

Java 为什么Android maps compass演示为SmoothCanvas类使用委托?

Java 为什么Android maps compass演示为SmoothCanvas类使用委托?,java,android,class,delegates,demo,Java,Android,Class,Delegates,Demo,在Eclipse中为Google API提供的Android MapsDemo中,他们在MapViewCompassDemo.java中创建了一个内部类SmoothCanvas。在这个类中,重新实现每个方法并将其重新路由到Canvas的委托实例 static final class SmoothCanvas extends Canvas { Canvas delegate; private final Paint mSmooth = new Paint(Paint.FILTER

在Eclipse中为Google API提供的Android MapsDemo中,他们在MapViewCompassDemo.java中创建了一个内部类
SmoothCanvas
。在这个类中,重新实现每个方法并将其重新路由到
Canvas
的委托实例

static final class SmoothCanvas extends Canvas {
    Canvas delegate;

    private final Paint mSmooth = new Paint(Paint.FILTER_BITMAP_FLAG);

    public void setBitmap(Bitmap bitmap) {
        delegate.setBitmap(bitmap);
    }

    public void setViewport(int width, int height) {
        delegate.setViewport(width, height);
    }
    ...

在这种情况下,委托的意义是什么

在这种情况下,授权的关键点是:

private final Paint mSmooth = new Paint(Paint.FILTER_BITMAP_FLAG);
一点。过滤会影响位图转换时的采样。过滤不会影响位图中的颜色如何转换为设备像素。这取决于抖动和xfermodes


通过激活该标志,绘制位图将基本上提高其性能。在本例中,您将看到
mSmoth
用于每个
drawBitmap
调用。

delegate
的值传递到
dispatchDraw
SmoothCanvas
类是
delegate
的包装器。通过授权,
Canvas
实现传递给
dispatchDraw
完成所有繁重的工作。包装器只允许注入平滑的油漆,而不实现
Canvas

的所有逻辑,但这又是如何产生使用委托的需要的呢?我想您正在回答为什么他们创建了扩展
Canvas
SmoothCanvas
类。我明白。我不明白的是,当他们已经在
Canvas
类中时,为什么他们创建
delegate
类型的
Canvas
属性?为什么他们不只是覆盖使用Paint对象的少数方法?这样:(还有更多,但没有空间全部粘贴)静态最终类SmoothCanvas扩展画布{private final Paint mSmooth=new Paint(Paint.FILTER_BITMAP_FLAG);@override public void drawBitmap(位图位图,左侧浮动,顶部浮动,绘制){if(Paint==null){paint=mSmooth;}else{paint.setFilterBitmap(true);}super.drawBitmap(位图,左,上,绘制);}没有意识到缩进在注释中是不起作用的:委托处理的是DeSpCuDigice的参数不是画布,而是一个导数。考虑如果传入的画布已经被重写来做其他事情会发生什么:模糊位图,渲染灰度级。如果你只提供你自己重写的画布,你可能会松散功能。通过授权,你可以使用原始的对象,但需要做一些修改。
static final class SmoothCanvas extends Canvas {
    Canvas delegate;

    private final Paint mSmooth = new Paint(Paint.FILTER_BITMAP_FLAG);

    public void setBitmap(Bitmap bitmap) {
        delegate.setBitmap(bitmap);
    }

    public void setViewport(int width, int height) {
        delegate.setViewport(width, height);
    }
    ...