如何创建一个比屏幕更大的视图?

35

是否可以创建一个比屏幕更大的视图?

我需要一个宽度比设备屏幕更大的视图,我在旋转动画中使用此视图。在旋转过程中,之前未显示在屏幕上的部分将变得可见。

有没有一种方法在Android框架中实现这个效果?

更新

我尝试将父布局设置得比屏幕大得多,这样做是有效的。虽然这样做可能会让某些事情变得有点不舒服,但仍然可以工作。现在的问题是,我的布局仍然从屏幕的左侧开始。我想不出一种方法来使布局自动扩展到屏幕的左侧和右侧。


1
我尝试将父布局设置得比屏幕大得多,而且它正在工作。你是怎么做到的? - Pacerier
2
例如,android:layout_height="1000dp" - Harry
10个回答

18

好的,我得到了一个答案。它并不是很好,因为它使用了一个被弃用的View类,但至少在我的当前测试屏幕分辨率上可以工作,其他分辨率将在明天测试。

我将想要扩展超出屏幕的视图包装在绝对布局中,如下所示:

<AbsoluteLayout
  android:layout_width="wrap_content"
  android:layout_height="fill_parent"
  android:layout_alignParentBottom="true">

  <ImageView
     android:id="@+id/content"
     android:layout_width="600dip"
     android:layout_height="420dip"
     android:scaleType="centerCrop"
     android:layout_x="-200dip"
     android:layout_y="60dip"
     android:src="@color/testcolor" />

</AbsoluteLayout>

将x坐标设为-200会使视图在屏幕左侧外突出200dip。如果我正在对该视图进行动画处理,那么在屏幕外的这些部分将逐渐变得可见。


3
absoluteLayout 现在已被弃用。 - yeahdixon
7
似乎将ImageView包裹在FrameLayout中可以实现负边距。我不理解为什么Android会让把一个视图放到屏幕外/部分屏幕外这么麻烦。 - John

9

例如,将负的底部边距与设置超大的layout_height(足够大)一起设置,解决了与我类似的问题。

至少在使用API 11+的动画/旋转时可以正常工作。

可能看起来像这样:

android:layout_marginBottom="-1000dp" android:layout_height="1000dp"


设置负边距对我来说有点奇怪,但它可以很好地工作,并且是一行代码的解决方案。 - Jason Hartley
负边距适用于许多视图,但它并没有得到官方支持。https://developer.android.com/reference/android/R.attr#layout_margin - Allan Veloso

7
如果还有人来到这个页面,关键在于你的根布局,它只能与FrameLayout(或已弃用的absolutelayout)一起使用。然后你有两个选项让你的子视图变大。
  1. 通过xml,这是快速简单的,但你不知道实际屏幕宽度和高度,所以你需要设置一个荒谬的高值来覆盖所有屏幕。
  2. 通过程序计算屏幕大小,并使视图的宽度/高度成比例地变大。
另外要注意,你更大的视图仍然从屏幕左上角开始,因此要考虑到这一点,你必须给出一个负的上和左边距,相当于你添加到视图宽度/高度的一半。
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) viewToMakeBigger.getLayoutParams();
int marginLeft = (int) (viewToMakeBigger.getWidth()*0.1);
int marginTop = (int) (viewToMakeBigger.getHeight()*0.1); 
params.width = (int) (viewToMakeBigger.getWidth()*1.2);
params.height = (int) (viewToMakeBigger.getHeight()*1.2);
params.leftMargin = -marginLeft;    
params.topMargin = -marginTop;
viewToMakeBigger.setLayoutParams(params);

@JasonHartley,你问:“你尝试过使用负边距吗?”这不是@Jordy答案中的代码(params.leftMargin = -marginLeft等)正在做的吗? - CODE-REaD
@JasonHartley,如果你删除了你的评论,我也会删除我的!请先留下一个像“下一分钟删除”这样的评论,这样我就能注意到。谢谢。 - CODE-REaD
我因为使用相对布局而不是帧布局,浪费了40小时工作周中的20小时。非常爱你! - Рома Богдан

5

这应该被标记为正确答案,因为AbsoluteLayout已经被弃用了。 - vosmith

4
下面的简单axml创建了一个ImageView,它比屏幕宽400dp(即使layout_width设置为等于父元素的宽度),使用负左右边距200dp。
使用负上边距将ImageView放置在屏幕顶部250dp处,屏幕上可见垂直像素的450dp是700dp。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<ImageView
        android:background="#FFFF0000"
        android:layout_height="700dp"
        android:layout_marginLeft="-200dp"
        android:layout_marginRight="-200dp"
        android:layout_marginTop="-250dp"
        android:layout_width="match_parent" />
</RelativeLayout>

3

您可以在onMeasure方法中覆盖视图。这将设置您的视图尺寸为1000x1000像素。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(1000, 1000);
}

onMeasure方法经常被调用。 - Jason Hartley

2

是否可以创建一个比屏幕更大的视图?

当然可以,你可以根据需要定义布局的宽度和高度,使用px(或dip)作为单位:

android:layout_width="10000px"
android:layout_height="20000px"

7
如果视图变得比其父布局更大,父布局将裁剪视图。 - Janusz
但是您可以使用带有负值的布局填充,这使您可以在内部“滚动”。 - WarrenFaith
好的,我之前没有说得很清楚。我更新了我的问题,这个方法可能可行,但现在我又遇到了另一个问题。 - Janusz
然后将这些10000px应用于父布局。 - Harry

1
你需要通过getWindow().setLayout更改窗口大小。这将增加窗口的大小。由于根布局可以像其父布局一样大,因此您可以增加要比屏幕尺寸大的视图的大小。对我有用,请告诉我。

请检查我的答案,它应该可以使你的Surface View比屏幕更大。 - Pulkit Sethi

0

你可以通过编程来实现:

    FrameLayout.LayoutParams rootViewParams = (FrameLayout.LayoutParams) rootView.getLayoutParams();
    rootViewParams.height=displayMetrics.heightPixels+(int)dpToPixels(60);
    rootViewParams.width=displayMetrics.widthPixels+(int)dpToPixels(60);
    rootView.setLayoutParams(rootViewParams);
    rootView.setX(rootView.getX() - dpToPixels(30));
    rootView.setY(rootView.getY() - dpToPixels(30));

必须仅在“public void onWindowFocusChanged(boolean hasFocus)”方法中使用。

        rootView = (RelativeLayout) findViewById(R.id.rootLayout);

在“protected void onCreate(Bundle savedInstanceState)”方法内部。

你的.xml文件应该像这样:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootLayout"
    tools:context="com.example.Activity">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_margin="30dp"  
    android:layout_centerVertical="true"
    android:layout_height="match_parent">

    // Bla bla bla

</RelativeLayout>

并且:

public float dpToPixels(float dp) {
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}

0
你可以使用 ViewSwitcher 来处理这个问题。结合 AnimationOnGestureListener 使用效果非常好。

我不想切换视图,我想要一个视图随着用户旋转手机而旋转,并根据手机方向显示不同的部分。 - Janusz
那我建议采用Paresh Mayani的建议或SurfaceView实现... - WarrenFaith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接