- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我编辑了 this code将 Rect 实例移出 onDraw 方法。我已经在多种设备上对其进行了测试。
public class BallBouncesActivity extends Activity {
BallBounces ball;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ball = new BallBounces(this);
setContentView(ball);
}
}
class BallBounces extends SurfaceView implements SurfaceHolder.Callback {
GameThread thread;
int screenW; //Device's screen width.
int screenH; //Devices's screen height.
int ballX; //Ball x position.
int ballY; //Ball y position.
int initialY ;
float dY; //Ball vertical speed.
int ballW;
int ballH;
int bgrW;
int bgrH;
int angle;
int bgrScroll;
int dBgrY; //Background scroll speed.
float acc;
Bitmap ball, bgr, bgrReverse;
boolean reverseBackroundFirst;
boolean ballFingerMove;
Rect toRect1, fromRect1;
Rect toRect2, fromRect2;
//Measure frames per second.
long now;
int framesCount=0;
int framesCountAvg=0;
long framesTimer=0;
Paint fpsPaint=new Paint();
//Frame speed
long timeNow;
long timePrev = 0;
long timePrevFrame = 0;
long timeDelta;
public BallBounces(Context context) {
super(context);
ball = BitmapFactory.decodeResource(getResources(), R.drawable.rocket); //Load a ball image.
bgr = BitmapFactory.decodeResource(getResources(), R.drawable.sky_bgr); //Load a background.
ballW = ball.getWidth();
ballH = ball.getHeight();
toRect1 = new Rect(0, 0, bgr.getWidth(), bgr.getHeight());
fromRect1 = new Rect(0, 0, bgr.getWidth(), bgr.getHeight());
toRect2 = new Rect(0, 0, bgr.getWidth(), bgr.getHeight());
fromRect2 = new Rect(0, 0, bgr.getWidth(), bgr.getHeight());
//Create a flag for the onDraw method to alternate background with its mirror image.
reverseBackroundFirst = false;
//Initialise animation variables.
acc = 0.2f; //Acceleration
dY = 0; //vertical speed
initialY = 100; //Initial vertical position
angle = 0; //Start value for the rotation angle
bgrScroll = 0; //Background scroll position
dBgrY = 1; //Scrolling background speed
fpsPaint.setTextSize(30);
//Set thread
getHolder().addCallback(this);
setFocusable(true);
}
@Override
public void onSizeChanged (int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//This event-method provides the real dimensions of this custom view.
screenW = w;
screenH = h;
bgr = Bitmap.createScaledBitmap(bgr, w, h, true); //Scale background to fit the screen.
bgrW = bgr.getWidth();
bgrH = bgr.getHeight();
//Create a mirror image of the background (horizontal flip) - for a more circular background.
Matrix matrix = new Matrix(); //Like a frame or mould for an image.
matrix.setScale(-1, 1); //Horizontal mirror effect.
bgrReverse = Bitmap.createBitmap(bgr, 0, 0, bgrW, bgrH, matrix, true); //Create a new mirrored bitmap by applying the matrix.
ballX = (int) (screenW /2) - (ballW / 2) ; //Centre ball X into the centre of the screen.
ballY = -50; //Centre ball height above the screen.
}
//***************************************
//************* TOUCH *****************
//***************************************
@Override
public synchronized boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: {
ballX = (int) ev.getX() - ballW/2;
ballY = (int) ev.getY() - ballH/2;
ballFingerMove = true;
break;
}
case MotionEvent.ACTION_MOVE: {
ballX = (int) ev.getX() - ballW/2;
ballY = (int) ev.getY() - ballH/2;
break;
}
case MotionEvent.ACTION_UP:
ballFingerMove = false;
dY = 0;
break;
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
//Draw scrolling background.
fromRect1.set(0, 0, bgrW - bgrScroll, bgrH);
toRect1.set(bgrScroll, 0, bgrW, bgrH);
fromRect2.set(bgrW - bgrScroll, 0, bgrW, bgrH);
toRect2.set(0, 0, bgrScroll, bgrH);
// Rect fromRect1 = new Rect(0, 0, bgrW - bgrScroll, bgrH);
// Rect toRect1 = new Rect(bgrScroll, 0, bgrW, bgrH);
//
// Rect fromRect2 = new Rect(bgrW - bgrScroll, 0, bgrW, bgrH);
// Rect toRect2 = new Rect(0, 0, bgrScroll, bgrH);
if (!reverseBackroundFirst) {
canvas.drawBitmap(bgr, fromRect1, toRect1, null);
canvas.drawBitmap(bgrReverse, fromRect2, toRect2, null);
}
else{
canvas.drawBitmap(bgr, fromRect2, toRect2, null);
canvas.drawBitmap(bgrReverse, fromRect1, toRect1, null);
}
//Next value for the background's position.
if ( (bgrScroll += dBgrY) >= bgrW) {
bgrScroll = 0;
reverseBackroundFirst = !reverseBackroundFirst;
}
//Compute roughly the ball's speed and location.
if (!ballFingerMove) {
ballY += (int) dY; //Increase or decrease vertical position.
if (ballY > (screenH - ballH)) {
dY=(-1)*dY; //Reverse speed when bottom hit.
}
dY+= acc; //Increase or decrease speed.
}
//Increase rotating angle
if (angle++ >360)
angle =0;
//DRAW BALL
//Rotate method one
/*
Matrix matrix = new Matrix();
matrix.postRotate(angle, (ballW / 2), (ballH / 2)); //Rotate it.
matrix.postTranslate(ballX, ballY); //Move it into x, y position.
canvas.drawBitmap(ball, matrix, null); //Draw the ball with applied matrix.
*/// Rotate method two
canvas.save(); //Save the position of the canvas matrix.
canvas.rotate(angle, ballX + (ballW / 2), ballY + (ballH / 2)); //Rotate the canvas matrix.
canvas.drawBitmap(ball, ballX, ballY, null); //Draw the ball by applying the canvas rotated matrix.
canvas.restore(); //Rotate the canvas matrix back to its saved position - only the ball bitmap was rotated not all canvas.
//*/
//Measure frame rate (unit: frames per second).
now=System.currentTimeMillis();
canvas.drawText(framesCountAvg+" fps", 40, 70, fpsPaint);
framesCount++;
if(now-framesTimer>1000) {
framesTimer=now;
framesCountAvg=framesCount;
framesCount=0;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread = new GameThread(getHolder(), this);
thread.setRunning(true);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
thread.setRunning(false);
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
class GameThread extends Thread {
private SurfaceHolder surfaceHolder;
private BallBounces gameView;
private boolean run = false;
public GameThread(SurfaceHolder surfaceHolder, BallBounces gameView) {
this.surfaceHolder = surfaceHolder;
this.gameView = gameView;
}
public void setRunning(boolean run) {
this.run = run;
}
public SurfaceHolder getSurfaceHolder() {
return surfaceHolder;
}
@Override
public void run() {
Canvas c;
while (run) {
c = null;
//limit frame rate to max 60fps
timeNow = System.currentTimeMillis();
timeDelta = timeNow - timePrevFrame;
if ( timeDelta < 16) {
try {
Thread.sleep(16 - timeDelta);
}
catch(InterruptedException e) {
}
}
timePrevFrame = System.currentTimeMillis();
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
//call methods to draw and process next fame
gameView.onDraw(c);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}
}
如果您注意到,这里有测量帧速率的代码:
now=System.currentTimeMillis();
canvas.drawText(framesCountAvg+" fps", 40, 70, fpsPaint);
framesCount++;
if(now-framesTimer>1000) {
framesTimer=now;
framesCountAvg=framesCount;
framesCount=0;
}
我在我的两台运行 Android 4.0 和 4.2 的 Galaxy Nexus 设备上看到,帧率大约为 22-24fps。在我的 HTC Desire 上,运行 Android 2.2,它更像是 60fps。
您还会注意到我没有在 onDraw
方法中分配任何内容。我也没有创建新的 Paint
对象。我真的不明白这是怎么运行的,所以,所以,如此 在我的 Galaxy Nexus 设备上慢得多。有很多口吃,球移动得很慢。
有谁知道在 Galaxy Nexus 上是否存在我可以撤消的设置或重新绘制的已知问题?这发生在我的 Galaxy Nexus 上,它运行 4.0 和 运行 4.2,所以我不确定它是否特定于操作系统。我已经在开发人员选项中关闭了窗口和过渡动画。是否强制 2D 加速没有区别。
最佳答案
您是否在应用程序中测试过 android:hardwareAccelerated="true|false"标志?
Android 开发文档:http://developer.android.com/guide/topics/graphics/hardware-accel.html
可以在setContentView之前添加:
if (android.os.Build.VERSION.SDK_INT >= 11) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
}
关于android - Galaxy Nexus 动画缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14617108/
我想在 galaxy fold 设备上查看我的页面时更改它的字体大小。但我不确定如何使用媒体查询来处理这个问题。任何人都可以帮助我并告诉我如何解决这个问题吗? 最佳答案 如果您需要对折叠版设备进行媒体
我想在 galaxy fold 设备上查看我的页面时更改它的字体大小。但我不确定如何使用媒体查询来处理这个问题。任何人都可以帮助我并告诉我如何解决这个问题吗? 最佳答案 如果您需要对折叠版设备进行媒体
我正在开发 Android Widget,需要区分 Galaxy S 和 Galaxy S2。我几乎阅读了所有关于屏幕尺寸和密度的文章。当然,我需要将新限定词与新限定词 Smallest Width
如何为 galaxy S3(720x1280 像素)和 galaxy Note(800x1280 像素)进行布局。 两者都是超高密度设备,因此我需要将两种设备的两组图像放在同一个文件夹 drawabl
我正在使用以下设置来初始化 MediaRecorder .我的应用程序在除三星以外的大多数设备上都能正常运行,并且在 MediaRecorder.stop() 上出现错误. recorder
我在连接到我的服务器以检查我的电话应用程序的凭据时遇到问题,我正在使用 phonegap 来开发它。 我已经检查过这些问题,但它们没有给我我正在寻找的东西 HTTP Requests in Phone
我想知道为什么 Galaxy S3 和 S4 从这个文件夹 (drawable-sw360dp-xhdpi) 获取图像?? 所有图像对于这些设备来说都显得非常大!另外,如果我将这些图像缩小,它们将不适
根据我的发现,Samsung galaxy s2 的分辨率为 480x800,而 s3 的分辨率为 1280x720。所以我认为我应该让我的图形设计师为我提供包含 480x800 背景图像的 hdpi
我有一部搭载 Android 4.0.2 和 NXP 演示板 PN532-C106 的 Galaxy Nexus 手机。 我正在尝试连接它们以使用 LLCP 协议(protocol)发送数据,我正在使
我在区分 samsung galaxy s4 和 samsung galaxy s3 的布局文件夹时遇到问题。我尝试过 layout-sw360dp、layout-sw360dp-xxhdpi、lay
我已经实现了一个 android 应用程序来在网络摄像头之间切换。我使用此代码 Android ICS and MJPEG using AsyncTask .它工作得很好。但是现在的问题。在对 Sam
我有一个奇怪的问题。我正在检索推特,它可以在模拟器和我的 Samsung Galaxy S 上运行,但它不能在我的 Galaxy Tab 10.1 上运行? 手机和标签页上都安装了相同的应用程序。从
我正在使用 FLASH_MODE_ON 打开相机 LED 灯。 三星 Galaxy Ace 只有三种闪光模式:开、关和自动。 FLASH_MODE_TORCH在三星 Galaxy Tab 和三星 Ga
我在安装以超时结束的 ansible 集合时遇到问题 # ansible-galaxy collection install community.general -vvvv ansible-galax
我正在尝试部署一个通过运行meteor部署appname创建的新应用程序,但它给了我这个错误...我使用我的meteor开发者用户名和密码登录... 我必须注册 Galaxy,还是无需注册就可以免费完
我正在尝试安装 Ansible Galaxy 集合,但我需要强制执行旧版本。 According to the documentation ,我尝试通过以下方式执行安装: $ ansible-gala
我正在尝试安装 Ansible Galaxy 集合,但我需要强制执行旧版本。 According to the documentation ,我尝试通过以下方式执行安装: $ ansible-gala
我的 friend 用他的新 galaxy 选项卡试用了我的应用程序,它似乎与我测试它的模拟器略有不同。他的应用程序选项菜单是黑色的,而不是白色背景,你无法真正看到任何选项,而且大多数应用程序都无法正
我是Andoid新手我想为 Galaxy 选项卡设计布局以及其他布局。我设计了四种布局Layout-small、large、xlarge 和 normal 布局。但是当我试图在 Galaxy 选项卡中
我想要做的就是有一个特定于桌面的版本,然后是一个可以在 iPhone、Android、iPad 和任何其他手持设备上运行的移动版本。 我现在检测桌面的是: @media only screen and
我是一名优秀的程序员,十分优秀!