我有一个像这样设置的VideoView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/player"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<VideoView
android:id="@+id/video"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_centerVertical="true" />
<ProgressBar
android:id="@+id/loader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
但VideoView匹配父容器的宽度,然后根据加载的影片的宽高比设置高度.
我想做的恰恰相反,我希望VideoView与父级的高度相匹配,同时保持宽高比不变,视频将被剪裁在两侧.
我设法拉伸VideoView来填充父级,但是不保持宽高比.
另一件事是,我将MediaController添加到VideoView,如下所示:
MediaController controllers = new MediaController(this) {
@Override
public void hide() {
if (state != State.Hidden) {
this.show();
}
else {
super.hide();
}
}
};
controllers.setAnchorView(videoView);
videoView.setMediaController(controllers);
videoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
controllers.show();
}
});
Run Code Online (Sandbox Code Playgroud)
这很好用,并且控制器始终保持打开状态,但在计算放置视频的位置时(因为它垂直居中),控制器的高度不会被考虑在内.
我的两个问题是:
谢谢.
我想有效地为相机预览做一个简单的数码变焦,所以我想我只需要将SurfaceView的大小调整为大于屏幕.其他问题(例如3813049)似乎表明这很容易,所以我创建了下面的示例代码,我希望让我只能看到水平图像的一半(因为SurfaceView的宽度是屏幕的两倍)并且具有图像只占水平屏幕的一半.但是,运行它(当我的Thunderbolt上使用Android 2.2.1定位到SDK版本4时)可以在水平填充屏幕时水平查看整个图像.SurfaceView似乎垂直行为(当我使它小于屏幕时),但Android不允许我使SurfaceView大于屏幕.
如何实现数码变焦?(不,我不能使用Camera.Parameters.setZoom;不仅Android 1.6不支持这种功能,而且不同的相机支持和实现这一点不同)
public class MagnifyTestActivity extends Activity implements SurfaceHolder.Callback {
private MagnificationView mPreview;
private SurfaceHolder mHolder;
private Camera mCamera = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPreview = new MagnificationView(this);
setContentView(mPreview);
mHolder = mPreview.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public class MagnificationView extends SurfaceView {
public MagnificationView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth()*2;
int height = display.getHeight()/2;
widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
heightMeasureSpec …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它使用OpenStreetMap(OSM)API在离线地图上显示由静态切片组成的各种兴趣点.
我目前正在实现的功能之一是让地图根据手机确定的方位旋转(通过GPS).我能够毫不费力地实现实际旋转,但由于我的代码旋转了整个画布 - 也许是一种相当天真的方法 - 我现在屏幕上有空白的角落,没有新的瓷砖被加载以补偿事实旋转的瓷砖不再填充这些像素.
经过一段谷歌搜索后,我找到了一些关于如何解决这个问题的建议,但到目前为止还没有运气.
在Romain Guy先生的一个帖子中,他提到了以下内容:
我过去已经这样做了,它需要创建一个自定义ViewGroup,在dispatchDraw()方法中旋转Canvas.您还需要增加MapView的大小(以便在旋转时绘制足够的像素.)您还需要在dispatchTouchEvent()中旋转触摸事件.或者,如果您使用Android 3.0,您只需调用theMapView.rotate()
根据他对地图轮换的建议,我已经按照建议实现了dispatchDraw()和dispatchTouchEvent(),但是我在提到需要增加MapView大小的部分时遇到了问题?
这是我在XML文件中做的事情,就像在这个线程中建议的那样?
或者,我可以以某种方式覆盖处理我的地图旋转的子类RelativeLayout类中的onMeasure()函数吗?
建议和提示是最受欢迎的.
更新:
为了找到这个问题的可接受的解决方案,我试图改变画布的大小.我们的想法是,如果画布尺寸大于实际屏幕尺寸,我可能会将空白角完全移出屏幕.不幸的是,似乎没有实际的canvas.size()选项; 我找到的最好的是canvas.scale().
使用canvas.scale(),我能够在水平和垂直尺寸上将画布的比例增加2倍.然而,这意味着图像被有效地放大,导致对地图图块的不可接受的像素化.
有谁知道画布的大小在哪里声明,如果改变画布的大小可能实际上解决了我的问题?