【问题标题】:Nesting surfaceview>Linearlayout>Horizontal scrollview嵌套surfaceview>Linearlayout>Horizo​​ntal scrollview
【发布时间】:2012-05-01 16:56:04
【问题描述】:

我一直在学习一些关于 android 中 2D 应用程序的教程。

目前我正在使用绘制到表面视图上的画布,但我想让我的屏幕水平滚动以制作一个基本的基于十六进制的策略游戏。到目前为止,我还没有什么快乐:

(我一直在使用的教程:http://www.droidnova.com/playing-with-graphics-in-android-part-vii,220.html

我应该扩展线性布局吗?

XML:

<?xml version="1.0" encoding="utf-8"?>

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:id="@+id/linearLayout"
>

</LinearLayout>


</HorizontalScrollView>

相关代码:

package com.blackslot.BlackMark;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.blackslot.BlackMark.gamethread;
import android.widget.LinearLayout;




import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.media.AudioManager;
import android.media.SoundPool;
import android.util.Log;

import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class Panel extends SurfaceView implements SurfaceHolder.Callback  {

/**
 * Thread which contains the game loop.
 */

private gamethread _thread;

 /**
 * List of graphics to handle.
 */
private ArrayList<Graphic> _graphics = new ArrayList<Graphic>();


/**
 * Sound pool
 */
private SoundPool _soundPool;


/**
 * Cache variable for all used images.
 */
private Map<Integer, Bitmap> _bitmapCache = new HashMap<Integer, Bitmap>();

/**
 * Constructor called on instantiation.
 * @param context Context of calling activity.
 */
public Panel(Context context) {
    super(context);
    fillBitmapCache();
    _soundPool = new SoundPool(16, AudioManager.STREAM_MUSIC, 100);
    getHolder().addCallback(this);
    _thread = new gamethread(this);
    setFocusable(true);
}

private void fillBitmapCache() {

    _bitmapCache.put(R.drawable.tacticalbuttondefault, BitmapFactory.decodeResource(getResources(), R.drawable.tacticalbuttondefault));
    _bitmapCache.put(R.drawable.targettingbuttondefault, BitmapFactory.decodeResource(getResources(), R.drawable.targettingbuttondefault));
   // _bitmapCache.put(R.drawable.ship1, BitmapFactory.decodeResource(getResources(), R.drawable.ship1));
   //_bitmapCache.put(R.drawable.ship2, BitmapFactory.decodeResource(getResources(), R.drawable.ship2));
    _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt));
}

/**
 * Draw on the SurfaceView.
 * Order:
 * <ul>
 *  <li>Background image</li>
 *  <li>Items on the panel</li>
 * </ul>
 */
@Override
public void onDraw(Canvas canvas) {
    // draw the background
    canvas.drawBitmap(_bitmapCache.get(R.drawable.abstrakt), 0, 0, null);
    Bitmap bitmap;
    Graphic.Coordinates coords;
    // draw the UI
    canvas.drawBitmap(_bitmapCache.get(R.drawable.tacticalbuttondefault), -2, 0, null);
    canvas.drawBitmap(_bitmapCache.get(R.drawable.targettingbuttondefault), -2, 120, null);




    // draw the normal items
    for (Graphic graphic : _graphics) {
        bitmap = graphic.getBitmap();
        coords = graphic.getCoordinates();
        canvas.drawBitmap(bitmap, coords.getX(), coords.getY(), null);
    }
}
// @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }

/**
 * Called on creation of the SurfaceView.
 * Which could be on first start or relaunch.
 */
// @Override
public void surfaceCreated(SurfaceHolder holder) {
    if (!_thread.isAlive()) {
        _thread = new gamethread(this);
    }
    _thread.setRunning(true);
    _thread.start();
}

/**
 * Called if the SurfaceView should be destroyed.
 * We try to finish the game loop thread here.
 */
// @Override
public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    _thread.setRunning(false);
    while (retry) {
        try {
            _thread.join();
            retry = false;
        } catch (InterruptedException e) {
            // we will try it again and again...
        }
    }
    Log.i("thread", "Thread terminated...");
}
}

谢谢。

【问题讨论】:

    标签: android android-linearlayout surfaceview horizontalscrollview


    【解决方案1】:

    决定使用位图的 X 和 Y 像素偏移来解决问题(允许双向滚动)并完全放弃水平滚动视图。

    虽然不是我正在寻找的解决方案,但它并没有太多额外的工作来获得更多控制。

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 2015-06-13
      • 2011-02-27
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多