Android - 显示活动/视图内容的预览

时间:2011-07-14 21:05:03

标签: android android-layout android-widget

我正在构建一个类似电子书的Android应用程序。标准翻页,查看图像等。其中一个要求是,在多个地方,您将看到页面外观的预览。它将是该页面的确切内容,只是尺寸较小。

我不能为我的生活让这个预览以我需要的方式工作。我编写了一个活动,它将根据附加内容中传递的某些值显示播放音频或视频的控件。这很好。预览应该是此活动,但仅限于较小的尺寸,并显示在单独的活动中。以下是我试图获得的较小版本的活动:

首先,我偶然发现了记录不完整的ActivityGroup对象。我想我可以使用它来调用活动,然后获取视图并以某种方式将其扔进父视图。这是代码的样子:

public class GroupTest extends ActivityGroup {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.grouptest);

    LocalActivityManager manager = getLocalActivityManager();

    Intent intent = new Intent();
    intent.setClass(getBaseContext(), ViewElement.class);
    intent.putExtra("ElementID", 22);
    intent.putExtra("PackID", 10);
    Window w = manager.startActivity("videoelement", intent);
    View v = w.getDecorView();

    // Grab the table and add a view to it.
    TableLayout tl = (TableLayout)findViewById(R.id.tlTest);
    TableRow tr = new TableRow(this);
    tr.addView(v);
    tl.addView(tr);
    }
}

以下是布局看起来很喜欢的内容:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1"
android:id="@+id/tlTest">
</TableLayout>

这种方式有效。活动ViewElement确实显示在GroupTest活动中。问题是,每当我尝试向表中添加其他内容(如标签)时,ViewElement活动就会消失。我暂时修补了一段时间,发现我没有掌握一些UI约束,然后意识到显示的ViewElement活动有可点击的按钮,这不是我真正想要的。我只想看看那个页面是什么样的,无法与它进行交互。

所以我尝试了另一种方法。找到关于将视图保存到图像的页面:http://jtribe.blogspot.com/2008/12/saving-view-as-image-with-android.html。听起来更像我想要的。

我修改后的代码现在看起来像:

public class GroupTest extends ActivityGroup {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tocrow);

    LocalActivityManager manager = getLocalActivityManager();

    Intent intent = new Intent();
    intent.setClass(getBaseContext(), ViewElement.class);
    intent.putExtra("ElementID", 22);
    intent.putExtra("PackID", 10);
    Window w = manager.startActivity("videoelement", intent);
    View v = w.getDecorView();
    Bitmap image = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.RGB_565);
    v.draw(new Canvas(image));
    ImageView img = (ImageView)findViewById(R.id.ivwElementPreview);
    img.setImageBitmap(image);
    }
}

布局(如果能让它工作的话,这是我将预览的实际布局):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<ImageView
    android:id="@+id/ivwElementPreview"
    android:layout_width="75px"
    android:layout_height="75px"
    android:layout_marginRight="6dip"
    android:src="@drawable/icon" />
<LinearLayout
    android:orientation="vertical"
    android:layout_width="0dip"
    android:layout_weight="1"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/txtElementTitle"
        android:layout_width="300px"
        android:layout_height="0dip"
        android:layout_weight="1"
    />
    <ImageView
        android:id="@+id/ivwPackIcon"
        android:layout_width="15px"
        android:layout_height="15px"
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" />
    <ImageView
        android:id="@+id/ivwPackIcon"
        android:layout_width="15px"
        android:layout_height="15px"
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" />
    <TextView
        android:id="@+id/txtElementComments"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
    />
</LinearLayout>
</LinearLayout>

这完全没有用。据我所知,调用w.getDecorView()不会返回实际上有任何高度,宽度或绘制属性的视图。如果我运行该代码我得到错误“宽度和高度必须> 0”如果我输入宽度和高度的值,没有任何显示,但黑色图像。然后我开始创建简单的东西,比如TextView,并将它绘制到位图中以显示在我的LinearLayout中,但是也永远不能让它正常工作。我完全厌倦了在Android中操纵UI。

所以,有没有其他人做类似的事情预览另一个活动会是什么样子,你是如何完成它的?我只是走错了路吗?我已经在各处搜索了一下,部分我感觉有人必须先解决这个问题,但我已经失去了一天的工作时间,而且我现在不能再投入更多的时间了。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您必须等到视图在屏幕上呈现,然后您可以要求它在任何画布上绘制自己。如果视图未在屏幕上显示,则会创建一个空的0x0图像。

答案 1 :(得分:0)

如果我输入正确,您希望在活动上放置一个缩略图,该缩略图实际上是在点击此缩略图ImageView时将打开的活动的预览。

  1. 您第一次拥有代表活动的默认图片。
  2. 下次,即打开此活动后,您可以获取活动的屏幕截图: Take a screenshot of a whole View
  3. 制作缩略图,并用此替换上一个缩略图。