2012-09-13 53 views
0

我有一个视图,我需要垂直翻转或镜像。有很多关于镜像单个位图的信息,通过将其缩放-1并转换为offset,如here所述,但似乎没有关于如何绘制View的所有内容的任何信息 - 具体而言,所有的子视图 - 颠倒。Android:镜像视图

我在这个容器中有多个子视图 - 文本,图像 - 我希望有一种方法可以让我将它们添加到单个视图中,并将该视图颠倒/侧向绘制,而不是让它们全部执行自定义绘制代码以便将它们倒置并将容器重新定位。有任何想法吗?

回答

2

您可以简单地在Bitmap之外创建一个Canvas,然后调用您的根视图的View.draw(Canvas)方法。这将为您提供Bitmap中的视图层次结构的快照。然后,您应用上述转换来镜像图像。

+0

我相信使用它这样,我还需要重新创建位图上的任何改变,例如一键进入/离开被照亮的状态? – Xono

+0

Xono,这是正确的。虽然如果你确切知道改变了什么,那么在一些数学的帮助下,你只需重新绘制包含改变的矩形。然而,这不是微不足道的。 – zienkikk

+0

听起来像是过度使用这种情况,这只会在接触/下降时更新。但是,一个可能的问题是:由于该视图包含按钮,视图上的输入也必须进行调整?简单地翻转渲染的内容不会改变实际按钮的位置,所以不会触及视图的错误部分? – Xono

1

传输视图为位图,然后将其翻转使用以下方法:

private static Bitmap getBitmapFromView(View view,int width,int height) { 
    int widthSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY); 
    int heightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY); 
    view.measure(widthSpec, heightSpec); 
    view.layout(0, 0, width, height); 
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    view.draw(canvas); 

    return bitmap; 
} 


private static Bitmap flipBitmap(Bitmap src) 
{ 
    Matrix matrix = new Matrix(); 
    matrix.preScale(-1, 1); 
    Bitmap dst = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, false); 
    dst.setDensity(DisplayMetrics.DENSITY_DEFAULT); 
    return dst; 
}