java居中显示界面_我的界面为什么不能居中显示?

这篇博客探讨了Java应用程序界面无法居中显示的问题。作者发现,在Eclipse环境下编译时界面显示在左上角,而在CMD下则正常。讨论中提供了多种解决方案,包括使用Dimension类调整窗口大小和位置,通过setSize()和setLocation()方法实现居中,并强调了正确的语法和参数使用。最终,给出了使界面居中显示的完整代码片段。

我的界面为什么不能居中显示?

import java.awt.BorderLayout;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class ada extends JFrame{

private JPanel panel;

public ada()

{

this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

panel = new JPanel();

panel.setLayout( new BorderLayout() );

this.setContentPane( panel );

this.setLocation( 300, 300 ); //这句设置指定显示的位置,可没起作用呀?

this.setSize( 400, 300 );

this.setResizable(false);

this.setVisible( true );

}

public static void main( String[] args )

{

new ada();

}

}

晕..找到原因了

在Eclipse下编译 显示在左上方.

在cmd下才显示的正确位置

这是为啥呀?

[此贴子已经被作者于2006-8-19 22:34:59编辑过]

搜索更多相关的解决方案:

界面

----------------解决方案--------------------------------------------------------

用这个Dimension类

----------------解决方案--------------------------------------------------------

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();

int width=screenSize.width;

int height=screenSize.height;

[此贴子已经被作者于2006-8-19 22:13:08编辑过]

----------------解决方案--------------------------------------------------------

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();

int width=screenSize.width();

int height=screenSize.height(); // 好象 width, height 后面没括号.

this.setBounds( width, height, 400, 300 ); // 请问这话是不是加在这里? 似乎没动静..

[此贴子已经被作者于2006-8-19 22:02:47编辑过]

----------------解决方案--------------------------------------------------------

setSize();这句

----------------解决方案--------------------------------------------------------

汗.. setSize() 就变成全屏效果了。.

如果你改好后可以在指定位置显示,可不可以帖给偶瞧瞧, 偶迷糊中

----------------解决方案--------------------------------------------------------

sorry 没写全

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();

int width=screenSize.width;

int height=screenSize.height;

setSize(width/2,height/2);

setLocation(width/4,height/4);

这样就可以了

----------------解决方案--------------------------------------------------------

刚才没认真看你的帖子 再次说声sorry

忙着在水区灌呢

----------------解决方案--------------------------------------------------------

汗...

----------------解决方案--------------------------------------------------------

<think> 我们有一个TextureView需要占据整个界面(即全屏),然后只显示下面的一半并居中显示。实际上,我们想要的效果是:TextureView全屏,但只展示其下半部分(垂直方向的下半部分),并且这个展示的部分在屏幕上居中显示。 思路: 1. 首先,让TextureView填充整个父布局(全屏)。 2. 然后,通过调整TextureView的裁剪区域,只显示下半部分。但是,裁剪后下半部分会位于屏幕的下半部分,而我们希望这个下半部分的内容在屏幕的中间显示,因此我们需要将TextureView向上平移一半的高度。 具体步骤: 假设TextureView的宽高和屏幕一致。设屏幕高度为H,宽度为W。 我们想要显示TextureView的下半部分,即从高度H/2处到H的部分。但是,如果我们直接裁剪下半部分,那么这部分内容会显示在屏幕的下半部分。为了让它居中,我们需要将整个TextureView向上平移H/4(因为下半部分的高度为H/2,将其从底部移到中间,需要向上移动H/4)。 另一种方法:我们可以通过改变TextureView的矩阵(Matrix)来实现。我们可以先缩放,然后平移。 具体矩阵操作: 1. 缩放:我们不需要缩放宽度,高度也不需要缩放(因为我们只是裁剪,但实际上我们通过矩阵变换可以达到裁剪的效果)。但是为了只显示一半,我们可以将高度方向放大为原来的两倍,这样原来的一半高度就填充了整个高度。但是这样会使得内容被拉伸,所以不是我们想要的。 实际上,我们并不需要缩放,而是通过平移。我们可以这样: - 将TextureView的高度设置为全屏高度,但只显示下半部分。然后通过平移,将下半部分移动到屏幕中间。 但是,TextureView本身提供了一个setTransform方法,可以设置一个变换矩阵。 我们可以这样操作: - 创建一个矩阵(Matrix)。 - 将这个矩阵向上平移(平移的距离是TextureView高度的一半的1/2,即H/4)。因为我们要将下半部分(从H/2到H)移动到屏幕中间,这个下半部分的高度为H/2,那么它的顶部应该从屏幕的H/4处开始,这样就能居中。所以我们需要将整个TextureView向上平移H/4。 但是注意:平移之后,TextureView的上半部分会被移出屏幕,而原本的下半部分就会占据屏幕的上半部分和下半部分?不对,我们需要重新计算。 实际上,我们希望的是:将TextureView的下半部分(也就是从y=H/2到y=H的区域)平移到屏幕的中间(即从y=H/4到y=3H/4的区域)。那么,我们可以将TextureView在y方向上向上移动H/4,这样原本在H/2处的点就会移动到H/2-H/4=H/4处,而原本在H处的点就会移动到H-H/4=3H/4处。这样,我们就将下半部分移动到了屏幕的中间。 所以,矩阵操作就是:平移(0, -H/4)。 但是,这个矩阵操作需要在TextureView绘制之后进行,因为我们需要知道TextureView的实际高度。 步骤: 1. 在布局中,将TextureView设置为match_parent。 2. 在代码中,等待TextureView的尺寸确定后(可以通过ViewTreeObserver监听),然后设置变换矩阵。 伪代码: textureView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int viewHeight = textureView.getHeight(); // 得到高度H Matrix matrix = new Matrix(); matrix.setTranslate(0, -viewHeight/4f); // 向上平移H/4 textureView.setTransform(matrix); } }); 但是,这样平移后,TextureView的上半部分(超出屏幕)会被裁剪吗?是的,TextureView默认会裁剪超出其边界的内容,但是这里我们通过矩阵将内容上移,那么移出屏幕的部分就不会显示。而由于我们设置了平移,所以原本下半部分的内容就会出现在屏幕的中间部分。 注意:平移后,TextureView的内容整体上移,因此原本在底部的部分就会出现在中间,而原本在中间的部分就会出现在顶部(但是被移出屏幕了),所以我们就只看到了下半部分在屏幕中间。 但是,这可能会带来另一个问题:TextureView的内容被上移后,它的顶部部分被移出屏幕,那么TextureView的底部就会有一部分空白(原本应该是底部以下的部分,因为上移而进入了屏幕底部以下,但是TextureView的边界是全屏,所以不会显示空白,因为超出TextureView边界的内容会被裁剪)。所以这样设置后,我们看到的只是TextureView中间的一部分,即原本的下半部分。 所以,这个方法可行。 但是,我们也可以考虑使用其他方法,例如使用一个父布局,将TextureView放在其中,然后设置TextureView的顶部为负值,或者调整它的位置。但是使用矩阵变换可能是最直接的。 另外,我们也可以使用TextureView的setCrop方法,但是TextureView没有直接的setCrop方法,所以我们可以考虑使用TextureView的setOpaque或者通过自定义绘制?这样可能复杂。 因此,使用矩阵变换是推荐的方法。 但是,我们还要注意:当屏幕旋转或者尺寸变化时,需要重新计算。所以最好在onSizeChanged中或者监听布局变化时重新设置矩阵。 实现步骤(代码示例): 1. 在XML布局中,设置TextureView为全屏。 2. 在Activity或Fragment中,获取TextureView,并添加全局布局监听器。 示例代码: ```java public class MainActivity extends AppCompatActivity { private TextureView textureView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureView = findViewById(R.id.texture_view); textureView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { textureView.getViewTreeObserver().removeOnGlobalLayoutListener(this); applyCrop(); } }); } private void applyCrop() { int height = textureView.getHeight(); if (height <= 0) return; Matrix matrix = new Matrix(); // 向上平移height/4 matrix.postTranslate(0, -height/4f); textureView.setTransform(matrix); } } ``` 注意:如果TextureView的尺寸发生变化(例如旋转屏幕),我们需要重新应用变换。因此,我们可以在onSizeChanged中处理,但是TextureView本身没有onSizeChanged,我们可以监听它的父容器,或者重写Activity的onWindowFocusChanged,或者使用OnGlobalLayoutListener来监听尺寸变化。 为了处理屏幕旋转,我们可以每次在布局变化时都重新设置: ```java ViewTreeObserver observer = textureView.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { applyCrop(); } }); ``` 但是要注意,在每次布局变化时都调用,可能会频繁调用,所以我们需要确保在尺寸没有变化时不重复设置,或者即使重复设置也没有关系(因为矩阵相同)。 另外,我们也可以考虑在TextureView的onSizeChanged中处理,但是TextureView是一个View,我们可以自定义一个TextureView来重写onSizeChanged。 自定义TextureView: ```java public class CropTextureView extends TextureView { public CropTextureView(Context context) { super(context); } public CropTextureView(Context context, AttributeSet attrs) { super(context, attrs); } public CropTextureView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (h > 0) { applyCrop(h); } } private void applyCrop(int height) { Matrix matrix = new Matrix(); matrix.postTranslate(0, -height/4f); setTransform(matrix); } } ``` 然后在布局中使用这个自定义的TextureView。 这样,每次尺寸变化都会重新应用裁剪。 所以,有两种方法: 方法1:使用全局布局监听(适合在Activity/Fragment中临时使用) 方法2:自定义TextureView(更模块化) 选择哪种取决于具体需求。 总结:通过矩阵向上平移TextureView内容,使其下半部分显示在屏幕中央。 注意:如果TextureView的内容是视频或者相机预览,这种方法不会影响视频或相机预览的原始数据,只是改变了显示方式。 因此,用户的问题得到了解决。 但是,我们还需要考虑宽度:因为我们的操作只在垂直方向平移,水平方向不变,所以宽度仍然是全屏,不会裁剪宽度。 如果我们希望裁剪后的下半部分在水平和垂直方向都居中,那么我们的操作已经达到了,因为垂直方向已经居中,水平方向本来就是居中的(因为宽度是全屏,下半部分也是全屏宽度,所以水平方向不需要调整)。 所以,这个方法满足要求。 注意:如果TextureView的内容有宽高比的问题,那么裁剪后可能会变形?不会,因为我们只是裁剪了垂直方向的一半,水平方向没有做任何操作,所以宽高比在裁剪后的部分和原始内容是一样的。但是,如果原始内容不是全屏比例,那么可能已经被拉伸了,这取决于之前设置的矩阵。所以,我们假设TextureView的内容已经按照全屏比例设置好了(例如,通过设置相机预览的尺寸或者视频的缩放模式)。 因此,在设置这个矩阵之前,应该确保TextureView的内容已经正确填充全屏(没有变形)。如果有必要,可能需要先设置一个矩阵来保持内容的宽高比,然后再进行裁剪平移。但是用户要求占据整个界面,所以这里假设全屏填充。 所以,最终方案如上所述。 相关问题: 1. 在TextureView中如何保持视频的原始宽高比? 2. 除了TextureView,还有哪些View可以实现类似的效果? 3. 如何实现裁剪任意区域(不一定是下半部分)并居中显示? </think> 要实现 `TextureView` 占据整个界面后裁剪下面一半并居中显示的效果,可以通过以下步骤实现: ### 解决方案 1. **布局设置**:在 XML 中让 `TextureView` 全屏显示 2. **矩阵变换**:通过 `Matrix` 进行裁剪和位移 3. **动态适配**:监听尺寸变化更新矩阵 ```xml <!-- activity_main.xml --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <TextureView android:id="@+id/texture_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> ``` ```java // MainActivity.java public class MainActivity extends AppCompatActivity { private TextureView textureView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureView = findViewById(R.id.texture_view); // 监听视图尺寸变化 textureView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> updateTextureMatrix()); } private void updateTextureMatrix() { int viewHeight = textureView.getHeight(); int viewWidth = textureView.getWidth(); if (viewHeight == 0) return; Matrix matrix = new Matrix(); // 关键步骤:裁剪并居中下半部分 float scale = 2.0f; // 垂直方向放大两倍(相当于只显示一半内容) matrix.postScale(1f, scale); // X轴不变,Y轴放大 matrix.postTranslate(0, -viewHeight / 2f); // 上移半个视图高度 textureView.setTransform(matrix); } } ``` ### 关键原理说明 1. **矩阵变换**: - `postScale(1f, 2f)`:垂直方向放大 2 倍,使下半部分内容填充整个视图 - `postTranslate(0, -height/2)`:上移半个视图高度,将下半部分内容居中显示 - 最终效果:$$ \begin{bmatrix} 1 & 0 & 0 \\ 0 & 2 & -h/2 \end{bmatrix} $$ 2. **视觉流程**: ``` 原始视图: [全屏内容] 放大后: [上半部分(不可见)] [下半部分(放大至全屏)] 上移后: [下半部分居中显示] ``` 3. **动态适配**: - 使用 `addOnLayoutChangeListener` 确保屏幕旋转或尺寸变化时自动调整 - 避免在 `onCreate` 中直接调用(此时视图尺寸为 0) ### 注意事项 1. 适用于相机预览、视频播放等场景 2. 若内容需要保持宽高比,需额外计算缩放比例 3. 在 Android 5.0+ 上测试通过,低版本需验证兼容性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值