是否有一种方法可以根据用于绘制它的Paint使用drawText()方法返回要在Android画布上绘制的文本的宽度(以像素为单位)?
我在游戏结束时显示了一个自定义警告对话框,以便玩家可以输入其名称进行保存.问题是当我打电话show()给对话框时,它不是垂直居中的!它比它应该低一点,无论我在xml中设置什么属性或使用时setGravity().
我认为这与此处提到的问题相同,但没有人给出正确答案.
谢谢你的帮助.
有关详细信息,请参阅以下代码:
AlertDialog.Builder builder;
LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.newrecord,(ViewGroup)findViewById(R.layout.shoot));
builder = new AlertDialog.Builder(this);
builder.setView(layout);
newRecDialog = builder.create();
Run Code Online (Sandbox Code Playgroud)
以下是XML布局的第一个元素的代码newrecord.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:gravity="center"
android:padding="10dp"
android:baselineAligned="true">
Run Code Online (Sandbox Code Playgroud)
以下是输出屏幕截图: alt text http://the.niox.free.fr/divers/dialog_offset.png
这是我的情况:我正在构建一个Android游戏,我的游戏活动由一个自定义的SurfaceView组成,它有一个游戏逻辑和渲染的线程.该架构类似于Google网站上的LunarLander演示.
当活动开始时,它会创建surfaceView并调用此方法:
@Override
public void surfaceCreated(SurfaceHolder holder)
{
renderThread.start();
}
Run Code Online (Sandbox Code Playgroud)
当我按下主页按钮退出游戏时,会调用onPause()方法,该方法调用surfaceDestroyed().在surfaceDestroyed中,我通过调用来停止游戏Thread:
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
synchronized(holder)
{
renderThread.stop();
}
}
Run Code Online (Sandbox Code Playgroud)
该应用程序的背景很好.然后,当我通过按下图标重新启动应用程序时,我在日志中收到"Thread already started"消息以及屏幕上的"强制关闭"弹出窗口.当活动在渲染线程上调用start()时进入"surfaceCreated"方法时,会出现此消息.
现在我已经研究了几个小时,无法弄清楚为什么会这样.我相信当我关闭应用程序时我的线程已经停止,所以我不明白为什么它说它已经开始了.
我在Android上制作游戏,当用户尝试长按屏幕时我需要执行某些操作.不幸的是我没有找到任何直接使用自定义SurfaceView的方法,随时告诉我这种方法是否存在:)
所以我决定尝试从onTouch事件监听器实现长触摸检测.
这是我的代码:
@Override
public boolean onTouch(View v, MotionEvent event)
{
long touchDuration = 0;
if ( event.getAction() == MotionEvent.ACTION_DOWN )
{
//Start timer
touchTime = System.currentTimeMillis();
}else if ( event.getAction() == MotionEvent.ACTION_UP )
{
//stop timer
touchDuration = System.currentTimeMillis() - touchTime;
if ( touchDuration < 800 )
{
onShortTouch(event,touchDuration);
}else
{
onLongTouch(event,touchDuration);
}
}
}
return true;
Run Code Online (Sandbox Code Playgroud)
这是有效的,但只有当用户停止触摸手机时,我才能检测到印刷机是否长按.所以这不是我想要的.我更喜欢当用户第一次触摸屏幕时启动计时器,然后一旦经过800毫秒就调用LongTouch()方法.换句话说,我不想检查自ACTION_DOWN以来ACTION_UP已经过了多长时间.我相信我应该为所述计时器使用一个线程,但我不能让它工作.使用以下代码时,只要触摸屏幕就会显示调试消息:
@Override
public boolean onTouch(View v, MotionEvent event)
{
long touchDuration = 0;
TouchThread touchThread = new TouchThread();
if ( event.getAction() == …Run Code Online (Sandbox Code Playgroud)