0

I've been working through some tutorials on 2D apps in android.

Currently I'm working with a canvas drawn onto a surfaceview, but I want to make my screen horizontally scrollable to make a rudimentary hex based strategy game. So far I've had little joy:

(Tutorial I've been working from: http://www.droidnova.com/playing-with-graphics-in-android-part-vii,220.html)

Should I be extending Linearlayout?

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>

Relevant code:

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...");
}
}

Thanks.

4

1 回答 1

0

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

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

于 2012-05-02T18:45:35.850 回答