嵌套surfaceview> Linearlayout>水平滚动视图

时间:2012-05-01 16:56:04

标签: android android-linearlayout surfaceview horizontalscrollview

我一直在研究Android中的2D应用教程。

目前我正在使用绘制在surfaceview上的画布,但我想让我的屏幕可以水平滚动以制作基于十六进制的基于策略的游戏。到目前为止,我一点也不高兴:

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

我应该扩展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>

相关代码:

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

感谢。

1 个答案:

答案 0 :(得分:0)

决定使用X&amp; amp;位图的Y像素偏移(允许双向滚动)并完全放弃水平视图。

虽然不是我想要的解决方案,但是对于更多的控制来说,它没有多少额外的工作。