怎么做放大ScrollPane

时间:2016-06-11 19:01:20

标签: java libgdx

我在游戏中设置缩放效果时遇到了问题。我的Stage对象由ScrollPane填充,其中Table包含Actor'sstage.getCamera().zoom。我希望可以使用手势放大和缩小该表的元素(并且滚动条调整到其新大小)。我已尝试使用package invisiblevideorecorder; import android.content.Context; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraManager; import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.CaptureRequest; import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.os.Environment; import android.os.Handler; import android.os.HandlerThread; import android.util.Log; import android.view.Surface; import java.io.File; import java.io.IOException; import java.util.Arrays; /** * @author Mark * @since 6/10/2016 */ public class InvisibleVideoRecorder { private static final String TAG = "InvisibleVideoRecorder"; private final CameraCaptureSessionStateCallback cameraCaptureSessionStateCallback = new CameraCaptureSessionStateCallback(); private final CameraDeviceStateCallback cameraDeviceStateCallback = new CameraDeviceStateCallback(); private MediaRecorder mediaRecorder; private CameraManager cameraManager; private Context context; private CameraDevice cameraDevice; private HandlerThread handlerThread; private Handler handler; public InvisibleVideoRecorder(Context context) { this.context = context; handlerThread = new HandlerThread("camera"); handlerThread.start(); handler = new Handler(handlerThread.getLooper()); try { mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); final String filename = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES).getAbsolutePath() + File.separator + System.currentTimeMillis() + ".mp4"; mediaRecorder.setOutputFile(filename); Log.d(TAG, "start: " + filename); // by using the profile, I don't think I need to do any of these manually: // mediaRecorder.setVideoEncodingBitRate(16000000); // mediaRecorder.setVideoFrameRate(30); // mediaRecorder.setCaptureRate(30); // mediaRecorder.setVideoSize(1920, 1080); // mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); // mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // Log.d(TAG, "start: 1 " + CamcorderProfile.hasProfile(CameraMetadata.LENS_FACING_BACK, CamcorderProfile.QUALITY_1080P)); // true // Log.d(TAG, "start: 2 " + CamcorderProfile.hasProfile(CameraMetadata.LENS_FACING_BACK, CamcorderProfile.QUALITY_HIGH_SPEED_1080P)); // false // Log.d(TAG, "start: 3 " + CamcorderProfile.hasProfile(CameraMetadata.LENS_FACING_BACK, CamcorderProfile.QUALITY_HIGH)); // true CamcorderProfile profile = CamcorderProfile.get(CameraMetadata.LENS_FACING_BACK, CamcorderProfile.QUALITY_1080P); Log.d(TAG, "start: profile " + ToString.inspect(profile)); // start: 0 android.media.CamcorderProfile@114016694 { // audioBitRate: 256000 // audioChannels: 2 // audioCodec: 3 // audioSampleRate: 48000 // duration: 30 // fileFormat: 2 // quality: 6 // videoBitRate: 17000000 // videoCodec: 2 // videoFrameHeight: 1080 // videoFrameRate: 30 // videoFrameWidth: 1920 // } mediaRecorder.setOrientationHint(0); mediaRecorder.setProfile(profile); mediaRecorder.prepare(); } catch (IOException e) { Log.d(TAG, "start: exception" + e.getMessage()); } } public void start() { Log.d(TAG, "start: "); cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); try { cameraManager.openCamera(String.valueOf(CameraMetadata.LENS_FACING_BACK), cameraDeviceStateCallback, handler); } catch (CameraAccessException | SecurityException e) { Log.d(TAG, "start: exception " + e.getMessage()); } } public void stop() { Log.d(TAG, "stop: "); mediaRecorder.stop(); mediaRecorder.reset(); mediaRecorder.release(); cameraDevice.close(); try { handlerThread.join(); } catch (InterruptedException e) { } } private class CameraCaptureSessionStateCallback extends CameraCaptureSession.StateCallback { private final static String TAG = "CamCaptSessionStCb"; @Override public void onActive(CameraCaptureSession session) { Log.d(TAG, "onActive: "); super.onActive(session); } @Override public void onClosed(CameraCaptureSession session) { Log.d(TAG, "onClosed: "); super.onClosed(session); } @Override public void onConfigured(CameraCaptureSession session) { Log.d(TAG, "onConfigured: "); } @Override public void onConfigureFailed(CameraCaptureSession session) { Log.d(TAG, "onConfigureFailed: "); } @Override public void onReady(CameraCaptureSession session) { Log.d(TAG, "onReady: "); super.onReady(session); try { CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); builder.addTarget(mediaRecorder.getSurface()); CaptureRequest request = builder.build(); session.setRepeatingRequest(request, null, handler); mediaRecorder.start(); } catch (CameraAccessException e) { Log.d(TAG, "onConfigured: " + e.getMessage()); } } @Override public void onSurfacePrepared(CameraCaptureSession session, Surface surface) { Log.d(TAG, "onSurfacePrepared: "); super.onSurfacePrepared(session, surface); } } private class CameraDeviceStateCallback extends CameraDevice.StateCallback { private final static String TAG = "CamDeviceStateCb"; @Override public void onClosed(CameraDevice camera) { Log.d(TAG, "onClosed: "); super.onClosed(camera); } @Override public void onDisconnected(CameraDevice camera) { Log.d(TAG, "onDisconnected: "); } @Override public void onError(CameraDevice camera, int error) { Log.d(TAG, "onError: "); } @Override public void onOpened(CameraDevice camera) { Log.d(TAG, "onOpened: "); cameraDevice = camera; try { camera.createCaptureSession(Arrays.asList(mediaRecorder.getSurface()), cameraCaptureSessionStateCallback, handler); } catch (CameraAccessException e) { Log.d(TAG, "onOpened: " + e.getMessage()); } } } } ,但它会改变我不想要的整个ScrollPane的大小。我提出了改变该表中所有演员的大小的想法,但是我不确定它是否是最有效的方式。有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

我认为最好的方法是,就像你说的那样,在滚动窗格中更改表格的大小。我实际上最终扩展了堆栈并改变了堆栈中表的规模,然后我有了另一个实际大小的表。我需要为我的应用程序:

public ZoomableStack() {
    imageTable = new Table();
    sizeTable = new Table();

    this.add(imageTable);
    this.add(sizeTable);

    layout();

    imageTable.setTransform(true);
}

获取表格的缩放尺寸:

@Override
public float getPrefWidth() {
    return imageTable.getWidth() * imageTable.getScaleX();
}

@Override
public float getPrefHeight() {
    return imageTable.getHeight() * imageTable.getScaleY();
}

覆盖布局方法,如下所示:

@Override
public void layout() {
    float width = this.getWidth();
    float height = this.getHeight();

    imageTable.setSize(imageTable.getPrefWidth(), imageTable.getPrefHeight());

    float tableWidth = imageTable.getWidth();
    float tableHeight = imageTable.getHeight();

    imageTable.setOrigin(tableWidth / 2, tableHeight / 2);
    imageTable.setPosition((width / 2 - (tableWidth / 2)), (height / 2 - (tableHeight / 2)));
    sizeTable.setBounds(((width - getPrefWidth()) / 2), ((height - getPrefHeight()) / 2), getPrefWidth(), getPrefHeight());
}

您可能需要覆盖setCullingArea(),因为该表最终会比屏幕大,然后表中的所有actor都会消失:

@Override
public void setCullingArea(Rectangle cullingArea) {

}

然后创建缩放方法,调用invalidateHierarchy():

public void zoom(float amount) {
    imageTable.scaleBy(amount);
    invalidateHierarchy();
}

然后,您只需将堆栈添加到滚动窗格并使用缩放:

ZoomableStack zoomableStack = new ZoomableStack();
new ScrollPane(zoomableStack);

zoomableStack.zoom(speed * amount);