绘制位图 - 将内容包装到Android中的Surface视图

时间:2013-02-05 12:57:57

标签: android bitmap surfaceview

我创建了一个带有线程的自定义表面视图类,我在相对布局中的主活动中添加了自定义表面视图。现在我在自定义表面视图类构造函数中声明一个位图。

public static Bitmap mbitmap;
public Surface(Context ctx, AttributeSet attrSet) {
        super(ctx, attrSet);
        context = ctx;
        mbitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.abc);         
        SurfaceHolder holder = getHolder();
        holder.addCallback(this);
    }

我在画布上绘制了它

public void doDraw(Canvas canvas) {
    canvas.drawBitmap(mbitmap, 0, 0, null);
}

我得到了成功的绘画。但它占据了整个屏幕

<RelativeLayout
    android:id="@+id/outer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 <com.cg.Surface
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
       <RelativeLayout
        android:id="@+id/processing_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </RelativeLayout>
</RelativeLayout>

即使我使用Wrap_Content作为高度和宽度,我也可以在后面绘制整个屏幕。如何单独绘制具有适当大小的位图图像?在自定义曲面视图类中使用此覆盖方法是否可行:

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{ }

如果没有如何在其中使用setMeasuredDimension并限制位图中的surfaceview的大小?

2 个答案:

答案 0 :(得分:4)

我们可以使用矩形,并使用Matrix在其中绘制图像,因此我们可以实现

public void doDraw(Canvas canvas)
{
int width = mbitmap.getWidth();
int height = mbitmap.getHeight();
float h= (float) height;
float w= (float) width;
Matrix mat=new Matrix();
mat.setTranslate( 500, 500 );
mat.setScale(800/w ,800/h);
canvas.drawBitmap(mbitmap, mat, null);
}

答案 1 :(得分:3)

我们可以使用

实现这一目标
public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint); 

我的意思是:

canvas.drawBitmap(bitmap, src, dst, paint);
onDraw中的

方法

Rect src = new Rect(0, 0, width, height);
Rect dst = new Rect(x, y, x + width, y + height); 

我希望完成它。我认为这可能对其他人有所帮助,因为我等待很长时间才能达到我自己的解决方案。