小编Nio*_*199的帖子

测量Canvas(Android)上绘制的文本宽度

是否有一种方法可以根据用于绘制它的Paint使用drawText()方法返回要在Android画布上绘制的文本的宽度(以像素为单位)?

android text draw android-canvas

125
推荐指数
4
解决办法
7万
查看次数

自定义警报对话框未在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

alert android dialog

12
推荐指数
1
解决办法
2万
查看次数

恢复活动时"线程已经开始"

这是我的情况:我正在构建一个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"方法时,会出现此消息.

现在我已经研究了几个小时,无法弄清楚为什么会这样.我相信当我关闭应用程序时我的线程已经停止,所以我不明白为什么它说它已经开始了.

java multithreading android android-lifecycle

9
推荐指数
2
解决办法
1万
查看次数

SurfaceView上的长触摸(android)

我在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)

multithreading android touch long-press

7
推荐指数
1
解决办法
7442
查看次数