You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android/Java扫雷APP开发:固定缩放与视图平移等技术咨询

Android扫雷APP固定缩放(100%/200%)开发问题解答

问题1:是否可创建宽高为屏幕两倍的视图并平移,还是需要逐个移动按钮与标签?

推荐直接用**ViewGroup(如ConstraintLayout、LinearLayout)**作为所有游戏元素(按钮、标签)的容器,不需要逐个移动子View。具体做法:

  • 获取屏幕宽高后,将容器的宽高设置为屏幕尺寸的2倍(对应200%缩放);
  • 通过容器的scrollTo()或scrollBy()方法实现整体平移,所有子View会自动跟随容器移动,效率远高于逐个操作子View。

示例代码:

// 获取屏幕像素尺寸
DisplayMetrics metrics = getResources().getDisplayMetrics();
int screenW = metrics.widthPixels;
int screenH = metrics.heightPixels;

// 初始化游戏容器
ConstraintLayout gameContainer = findViewById(R.id.game_container);
ViewGroup.LayoutParams params = gameContainer.getLayoutParams();
// 200%缩放时设置容器尺寸为屏幕两倍
params.width = screenW * 2;
params.height = screenH * 2;
gameContainer.setLayoutParams(params);

// 平移容器到指定位置(示例:x偏移50,y偏移50)
gameContainer.scrollTo(50, 50);

问题2:顶部固定工具栏,如何获取屏幕剩余区域尺寸?

需要等布局完成后获取工具栏的实际高度,再计算剩余区域尺寸,推荐两种方式:

方式1:利用onWindowFocusChanged

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        Toolbar bombToolbar = findViewById(R.id.bomb_count_toolbar);
        int toolbarHeight = bombToolbar.getHeight();
        
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int availableWidth = metrics.widthPixels;
        int availableHeight = metrics.heightPixels - toolbarHeight;
        
        // 用availableWidth/availableHeight配置游戏区域
    }
}

方式2:利用ViewTreeObserver

Toolbar bombToolbar = findViewById(R.id.bomb_count_toolbar);
bombToolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // 移除监听避免重复触发
        bombToolbar.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        
        int toolbarHeight = bombToolbar.getHeight();
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int availableWidth = metrics.widthPixels;
        int availableHeight = metrics.heightPixels - toolbarHeight;
        
        // 配置游戏区域逻辑
    }
});

问题3:平移/手势示例针对图片,不支持按钮和标签移动?

图片是单个View,而你的按钮、标签是ViewGroup的子元素,直接操作ViewGroup的滚动即可带动所有子View。如果需要手势控制平移(暂不支持但可预留实现),给容器添加触摸监听处理:

float touchStartX, touchStartY;
ConstraintLayout gameContainer = findViewById(R.id.game_container);

gameContainer.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchStartX = event.getX();
                touchStartY = event.getY();
                return true;
            case MotionEvent.ACTION_MOVE:
                float dx = touchStartX - event.getX();
                float dy = touchStartY - event.getY();
                // 按触摸偏移量平移容器
                gameContainer.scrollBy((int) dx, (int) dy);
                touchStartX = event.getX();
                touchStartY = event.getY();
                return true;
        }
        return false;
    }
});

额外提示:平移时需处理边界限制,比如容器宽为2倍屏幕时,x方向最大偏移量为screenW,最小为0,避免出现空白区域。


内容的提问来源于stack exchange,提问作者Ricardo Fodra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:57:20