在自定义ImageView中缩放图像

时间:2011-08-21 20:45:17

标签: android view canvas bitmap imageview

我正在扩展ImageView,以便在视图中手动缩放图像。我想缩放图像以填充自定义视图的宽度,然后将其绘制到画布,但是,我无法使用this.getWidth()获取视图宽度 它只返回0,因为视图尚未绘制,因此维度0为0。

目前我的main.xml中有以下内容:

<com.android.myapp.BackgroundView
    android:id="@+id/background_view"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:src="@drawable/background"
    android:dither="true"
    />

自定义类如下:

public class BackgroundView extends ImageView {

    private Paint paint;
    private Bitmap background;

    public BackgroundView(Context context) {
        super(context);
        paint = new Paint();
        loadBitmap();
    }

    public BackgroundView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        loadBitmap();
    }

    public void loadBitmap() {
        BitmapDrawable src = (BitmapDrawable) this.getDrawable();
        background = src.getBitmap();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(background, 0, 0, paint);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}

我的Main.java类是:

public class Main extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

我不能用左 Bitmap.createScaledBitmap(background, view.getWidth(), view.getHeight(), false)
由于视图尚未绘制,我如何在此时缩放图像以填充视图/屏幕宽度?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我相信您想要做的事情也可以通过将ImageView直接与scaleType属性结合使用来实现。根据您的需要,使用 fitXY centerCrop

但是要回答这个问题,你只能在调用layout()之后使用getWidth()和getHeight()。因此,您应该能够使用onDraw方法中的值。

此外,您可以使用其他drawBitmap方法,这样您就不必在内存中创建新的位图。