- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我创建了自己的自定义 GIFView 组件来显示动画 GIF。我的问题是 Android 无法将其正确放置在中心位置。我试图从各种来源寻找这个,但大多数都是关于如何动态地执行此操作的,而我想纯粹使用 XML 布局来执行此操作。
问题是这样的:
如果我不覆盖“onMeasure()”,那么我的 GIFView 似乎会占用屏幕中的所有空间。这导致布局中的所有元素都被绘制到屏幕的最顶部。我的 GIF 就像一个进度条(高度 = 8px,宽度 = 152px),所以它不需要太多高度。无论如何,Android 是这么认为的,并给它整个屏幕(我的解释基于给 onMeasure 方法的 MeasureSpecs)。动画现在就在 TextView 下方,但不在中心区域。相反,它位于该区域的左上角。
如果我确实覆盖了“onMeasure()”,那么 TextView 会在屏幕中间正确绘制,进度动画会在其下方绘制。但是,在这种情况下,动画 GIF 的位置也位于该区域的左上角,而它应该位于该区域的中间。
如果我确实覆盖了“onMeasure()”,然后根据需要调用“setMeasuredDimension()”来设置测量值,但不调用 super.onMeasure(),那么它的行为就像以防万一 ( 1).这意味着布局占据了整个屏幕,我的 TextView 可以从屏幕的最顶部找到。
我不确定我是否有任何意义,所以我尝试在这里从数学意义上给你这个想法(我无法发布屏幕截图,因为我是新用户)。因此,相对布局在 TextView 正下方提供与屏幕一样宽 (screenWidth) 和所需高度 (paddingTop + paddingBottom + GIFView.getHeight()) 的区域。现在我希望看到我的动画从以下位置开始绘制:(x = paddingLeft + (screenWidth - paddingLeft - paddingRight - GIFView.getWidth())/2) 和 (y = paddingTop)。相反,我看到 Android 将其绘制到 (x = 0) 和 (y = 0) 的位置。
我确信这里的问题是我刚刚忽略的,但如果有人有时间研究这个,我将不胜感激......
所以,我遇到这个问题的 fragment :
样式声明:
<declare-styleable name="GIFView">
<attr name="resourceId" format="reference" />
</declare-styleable>
主要布局 XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:isScrollContainer="true"
android:background="#EFEFEF" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.myown.smthg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:orientation="vertical"
android:background="@drawable/background_white_gray"
android:paddingLeft="16dip"
android:paddingRight="16dip"
android:isScrollContainer="true" >
<TextView
android:id="@+id/TextViewWaitReason"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="12dip"
android:paddingLeft="12dip"
android:paddingRight="12dip"
android:textColor="#343434"
android:textSize="20sp" />
<com.myown.smthg.util.GIFView
custom:resourceId="@drawable/progress_bar"
android:id="@+id/progressGIF"
android:layout_below="@id/TextViewWaitReason"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="0dip"
android:paddingLeft="24dip"
android:paddingRight="24dip"
android:paddingBottom="16dip" />
</RelativeLayout>
然后是GIFView.java的代码:
public class GIFView extends View {
// The resource id of the GIF
private int mResourceId;
// Movie to be shown
private Movie mMovie;
private long mStartTime;
// Size of this View
private int mHeight, mWidth;
/**
* Constructor
*
* @param context
* @param attributes
*/
public GIFView( Context context, AttributeSet attributes ) {
super( context, attributes );
// Get the attribute for resource id
TypedArray t = context.getTheme().obtainStyledAttributes(
attributes, R.styleable.GIFView, 0, 0 );
mResourceId = -1;
mMovie = null;
mStartTime = 0;
mHeight = 0;
mWidth = 0;
// This call might fail
try
{
mResourceId = t.getResourceId ( R.styleable.GIFView_resourceId, -1 );
mMovie = Movie.decodeStream( context.getResources().openRawResource( mResourceId ) );
if( mMovie != null )
{
mWidth = mMovie.width();
mHeight = mMovie.height();
}
}
finally
{
t.recycle();
}
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
final int desiredHSpec = MeasureSpec.makeMeasureSpec( mHeight, MeasureSpec.EXACTLY );
final int desiredWSpec = MeasureSpec.makeMeasureSpec( mWidth, MeasureSpec.EXACTLY );
setMeasuredDimension( desiredWSpec, desiredHSpec );
super.onMeasure( desiredWSpec, desiredHSpec );
}
@Override
protected void onDraw( Canvas canvas )
{
super.onDraw( canvas );
// Return if we have no movie
if( mMovie == null ) return;
// Catch the time now
long now = System.currentTimeMillis();
// Catch the start time if needed
if( mStartTime == 0 ) mStartTime = now;
int relTime = (int)( (now- mStartTime) % mMovie.duration() );
mMovie.setTime( relTime );
mMovie.draw( canvas, 0, 0 );
this.invalidate();
}
如果这很重要,那么 Activity 构造函数如下所示:
super.onCreate( savedInstanceState );
// Set the content view
setContentView( R.layout.layout_wait );
// Get the String to be shown
Intent intent = getIntent();
String waitStr = intent.getStringExtra( myService.EXTRA_TEXT );
// Set the done text
TextView t = (TextView)findViewById( R.id.TextViewWaitReason );
if( t != null && waitStr != null )
t.setText( waitStr );
那么,为什么我不能让动画在文本下方和屏幕中央运行?如果我之前能弄清楚,我会在这里发布修复...它与 onMeasure() 方法有关,因为覆盖它会改变一切。
关于 fragment 的免责声明:我不会在 onDraw() 的末尾留下 invalidate()...
Br,提姆
最佳答案
好的,感谢所有有时间研究这个问题的人。我也这样做了,正如我所料,解决方案相当简单......
问题是我没有为我的 View 声明正确的大小,只是声明它与 GIF 一样宽。因此,修复 onMeasure 以设置尺寸以获取所有给定的宽度,然后考虑填充并绘制到正确的位置固定一切。固定代码 fragment :
新变量:
private int mDrawLeftPos;
固定在测量上
@Override
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec )
{
int p_top = this.getPaddingTop(), p_bottom = this.getPaddingBottom();
// Calculate new desired height
final int desiredHSpec = MeasureSpec.makeMeasureSpec( mHeight + p_top + p_bottom , MeasureSpec.EXACTLY );
setMeasuredDimension( widthMeasureSpec, desiredHSpec );
super.onMeasure( widthMeasureSpec, desiredHSpec );
// Update the draw left position
mDrawLeftPos = Math.max( ( this.getWidth() - mWidth ) / 2, 0) ;
}
固定onDraw
@Override
protected void onDraw( Canvas canvas )
{
super.onDraw( canvas );
// Return if we have no movie
if( mMovie == null ) return;
// Catch the time now
long now = System.currentTimeMillis();
// Catch the start time if needed
if( mStartTime == 0 ) mStartTime = now;
int relTime = (int)( (now- mStartTime) % mMovie.duration() );
mMovie.setTime( relTime );
mMovie.draw( canvas, mDrawLeftPos, this.getPaddingTop() );
}
Br,提姆
关于java - 安卓用户界面 : Positioning of custom GIF View within RelativeLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12918543/
我正在阅读 Youtube 上的 Kubernetes 教程,发现以下 UI 演示了 Kubernetes 集群的 pod 和服务安排。如何在我的 Kubernetes 设置中安装此 UI? 最佳答案
这只是一个快速的(我希望)。 我最近访问了 jquery ui 对话框页面,查看在对话框中使用表单 http://jqueryui.com/dialog/#modal-form我注意到一些我以前没有见
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我想用 Java 为一个程序创建一个用户界面,让用户能够构建一棵节点树,每个节点执行一项特定的任务。该程序的界面与 Softimage Ice 非常相似,您可以通过单击 http://vimeo.co
下面是我在 SwiftUI 中创建 View 的代码。我要定位我的 欢迎按钮 到屏幕底部,如下所示。 struct welcomeViewControllerView: View { va
我目前有一个文本编辑器,我希望能够像这样在笔记应用程序中添加文本格式: 我试过 UITextView.allowsEditingTextAttributes = true但它似乎没有用。 任何想法将不
我不知道如何使用HDFS连接我的网站(我什至不确定是否有可能)。 我的网站基于PHP。我想存储有人点击我的网站的区域,如何将我的PHP与HDFS连接起来? 是否涉及任何插件?如果我希望这些信息被实时存
我正在寻找用 javascript 编程的新方法。我的目标是创建像 GMail 这样的 javascript 应用程序。我试过 GWT,但它接缝太复杂,而且代码也不时尚。 我发现 MVC 模式是一种很
我有多个渐变作为我的应用程序的主题。当渐变(存储在变量中)是特定的时,我想要一个 bool 值变为真。但是,我不断收到错误消息: "Binary operator '==' cannot be app
我有一个有很多类别的测验应用程序: 类别 1 列出第 1 项 列出第 2 项 类别 3 第 4 类 第 5 类 列出第 1 项 列出第 2 项 列出第 3 项 所以类别要么是指一般的不可选择的类别,即
如果我单击仅搜索“2018”的搜索按钮,但如果我在搜索“2018 歌曲”的电脑上按回车按钮,我想搜索“2018”,如果我在电脑上按回车按钮,我怎么能使用 Autocomplete | jQuery U
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在尝试为患有轻度认知障碍的祖母创建一个安卓平板电脑应用程序。该应用程序的功能之一是智能调度程序/提醒。例如:该应用程序会说“您服用红色药丸了吗?”是或否。如果没有或没有回复,则会向我的手机发送一条
有没有办法确保我的 Android UI 在不同手机上按预期显示? 最佳答案 遍历 developers guide on supporting multiple screens .它为您提供有关该主
我正在为 iPad 和 iPhone 创建一个通用应用程序。我有一个 UITextField,我希望用户在其中输入歌曲的名称或在他们的 iTunes 库中找到的任何声音媒体文件。我的问题不是关于查询图
这个问题在这里已经有了答案: Making a Chess Game with jQuery UI. I have used Draggable, but i need to make them n
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我想从选择器中获取所选项目以更新 Firebase 数据库中的一些数据,但是当我使用 onTapGesture 时不起作用 注意:选择器中的项目是字符串 我的代码: Picke
我需要我的应用程序在启动时配置后端,这是执行此操作的函数: // Initializes Amplify final func configureAmplify() async { do {
我有这个 Web 应用程序,其中一个模块使用了过多的 ui:include。 前任。 页面 1.0 包括 --> page1.1 包括页面 2.0 包括 --> 页面 2.1 页面 1.0 包括 --
我是一名优秀的程序员,十分优秀!