gpt4 book ai didi

android - 如何在不耗尽内存的情况下在 droid 中制作益智应用程序?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:25 25 4
gpt4 key购买 nike

我注意到来自 google play store 的其他拼图应用最多可以有 400 个独立的可移动拼图 block

我一直在尝试学习如何至少拍摄一张能代表我的谜题的图像,裁剪某些部分并用拼图设计掩盖图像空间,以创建我的个人拼图

我想为我的应用程序最多使用 20 block ,但到目前为止,根据我的 android studio 内存日志,一旦位图工厂完成创建一个拼图 block ,在创建 20 block 拼图后,我用掉了大约 18mb 的内存该应用程序的所有其他功能我正在使用 400+mb 的内存,我必须使用“largeHeap=true”来防止内存不足,但我已经接近超过这些更高的限制,所以该应用程序非常棒缓慢而足够的动画 Activity 将不可避免地导致应用程序崩溃

我很想知道那些其他 Play 商店益智应用在做什么而我没有做

非常感谢任何输入

仅供引用,我的图像使用 PNG24,测试图像的尺寸为 556x720

这是一个例子,如果我只创建一个动画拼图图片

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//Remove title bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//Hides notification bar
this.setContentView(R.layout.activity_main);//set content view AFTER ABOVE sequence (to avoid crash)

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

mainDisplay = getWindowManager().getDefaultDisplay();
mainLayout = (ViewGroup) findViewById(R.id.id_layout);

DisplayMetrics m = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(m);
int windowHeight = m.heightPixels;
int windowWidth = m.widthPixels;

offsetX = (windowWidth / 1440.0f);
offsetY = (windowHeight / 2560.0f);

ourContext = this;

xpos = new float[2];
ypos = new float[2];

iv_PuzzleOne();

bkgdbm = BitmapFactory.decodeResource(getResources(), R.drawable.puzzleimage);

paintObject = new Paint();
paintObject.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));

bm_PuzzleOne();

thisTimerTask = new ThisClass();
thisTimer = new Timer();
thisTimer.scheduleAtFixedRate(thisTimerTask, 16, 16);

touchpad = new ImageButton(this);
SetPos(0, 0, 1440, 2560);
touchpad.setLayoutParams(layoutPositioner);
touchpad.getBackground().setAlpha(1);
mainLayout.addView(touchpad);

touchpad.setOnTouchListener(new View.OnTouchListener() {

//@SuppressLint("NewApi")
@Override
public boolean onTouch(View v, MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {
xpos[0] = event.getX(); //storing my finger's position coordinates when I first touch the screen into the 1st element
ypos[0] = event.getY();

if ((event.getX() > imgx1) && (event.getX() < imgx1 + imagewidth1)
&& (event.getY() > imgy1) && (event.getY() < imgy1 + imageheight1)) {
touching1Puzzle = true;
img1.bringToFront();
}

}

if (event.getAction() == MotionEvent.ACTION_MOVE) {

xpos[1] = event.getX(); //add my finger's new current coordinates into the 2nd element
ypos[1] = event.getY();

if (touching1Puzzle) {
adjustImg();
}
}

if (event.getAction() == MotionEvent.ACTION_UP) {
if (touching1Puzzle) {
touching1Puzzle = false;
}

}

return false;
}

});
}


void bm_PuzzleOne()
{
//start of 1st puzzle

foregdimg1 = BitmapFactory.decodeResource(getResources(), R.drawable.puzzlepieceprac);//puzzle cut out (42.48MB) +6.15
mutableforegdimg1 = foregdimg1.copy(Bitmap.Config.ARGB_8888, true); //(48.32MB) +5.84

compositeImage1 = Bitmap.createBitmap(mutableforegdimg1);//cuts out foreground info into bkgdimage (54.43MB) +6.11

imgCanvas1 = new Canvas(compositeImage1); //canvas references puzzle cut out image (54.43MB) +0
imgCanvas1.drawBitmap(croppedBmp, null, new Rect(0, 0, 1500, 2000), paintObject);//places puzzle image on canvas (54.43MB) +0

img1.setImageBitmap(compositeImage1);

}


void iv_PuzzleOne()
{
img1 = new ImageView(ourContext);
SetPos(imgx1, imgy1, imagewidth1, imageheight1);
//bkgdimg.setImageResource(R.drawable.c);
//img1.setBackgroundColor(0xffF07305); //Orange
img1.setLayoutParams(layoutPositioner);
mainLayout.addView(img1);

}

void adjustImg()
{
if (touching1Puzzle)
{
if (xpos[1] > xpos[0]) //if the image had slid to the right
{
xPositionDifference = xpos[1] - xpos[0]; // find the difference in coordinate value between where my finger was and where it currently is
imgx1 += xPositionDifference; //add that difference to the current image position ...

xpos[0] += xPositionDifference; // ... store that difference for the next shift in finger postion

} else if (xpos[1] < xpos[0]) //if the image had slid to the left
{
xPositionDifference = xpos[0] - xpos[1]; // find the difference in coordinate value between where my finger was and where it currently is
imgx1 -= xPositionDifference; //subtract that difference to the current image position ...

xpos[0] -= xPositionDifference; // ... store that difference for the next shift in finger postion
}

if (ypos[1] > ypos[0]) //if the image had slid to the right
{
yPositionDifference = ypos[1] - ypos[0]; // find the difference in coordinate value between where my finger was and where it currently is
imgy1 += yPositionDifference; //add that difference to the current image position ...

ypos[0] += yPositionDifference; // ... store that difference for the next shift in finger postion

} else if (ypos[1] < ypos[0]) //if the image had slid to the left
{
yPositionDifference = ypos[0] - ypos[1]; // find the difference in coordinate value between where my finger was and where it currently is
imgy1 -= yPositionDifference; //subtract that difference to the current image position ...

ypos[0] -= yPositionDifference; // ... store that difference for the next shift in finger postion

}
}

}

class ThisClass extends TimerTask {

@Override
public void run() {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {

if(touching1Puzzle)
{SetPos(imgx1, imgy1, imagewidth1, imageheight1);
img1.setLayoutParams(layoutPositioner);}

}
});
}
}

public void SetPos(float x, float y, float width, float height) {
layoutPositioner = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutPositioner.topMargin = (int) (offsetY * y);
layoutPositioner.leftMargin = (int) (offsetX * x);
layoutPositioner.width = (int) (width * offsetX);
layoutPositioner.height = (int) (height * offsetY);
}

这是我加载 5 张图片时的样子

http://s15.postimg.org/ymqspk77v/Screenshot_2016_02_29_07_19_26.png

最佳答案

好吧,让我们看看。

首先你不需要这么大的拼图,所以你可以缩小它们:

来自 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

To tell the decoder to subsample the image, loading a smaller version into memory, set inSampleSize to true in your BitmapFactory.Options object. For example, an image with resolution 2048x1536 that is decoded with an inSampleSize of 4 produces a bitmap of approximately 512x384. Loading this into memory uses 0.75MB rather than 12MB for the full image (assuming a bitmap configuration of ARGB_8888)

其次,您应该尝试在 AsyncTask 中加载位图以防止应用程序卡住。

第三,您可以使用 LruCache 缓存您的位图以加快速度

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

private LruCache<String, Bitmap> mMemoryCache;

@Override
protected void onCreate(Bundle savedInstanceState) {
...
// Get max available VM memory, exceeding this amount will throw an
// OutOfMemory exception. Stored in kilobytes as LruCache takes an
// int in its constructor.
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

// Use 1/8th of the available memory for this memory cache.
final int cacheSize = maxMemory / 8;

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// The cache size will be measured in kilobytes rather than
// number of items.
return bitmap.getByteCount() / 1024;
}
};
...
}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}

public Bitmap getBitmapFromMemCache(String key) {
return mMemoryCache.get(key);
}

这应该足够了,但如果还不够的话,这里有所有来源,还有一些额外的: http://developer.android.com/training/displaying-bitmaps/index.html

你也可以尝试使用

void bm_PuzzleOne()
{
//start of 1st puzzle
BitmapFactory.Options opt = new BitmapFactory.Options();

//makes a loaded image mutable
opt.inMutable=true;
//reduces density to that of screen
opt.inTargetDensity = this.context.getResources().getDisplayMetrics().densityDpi;
opt.inScaled=true;

//makes bitmap half as big
opt.inSampleSize=2;

//foregdimg1 = BitmapFactory.decodeResource(getResources(), R.drawable.puzzlepieceprac);//puzzle cut out (42.48MB) +6.15
mutableforegdimg1 = BitmapFactory.decodeResource(getResources(), R.drawable.puzzlepieceprac,opt)

compositeImage1 = Bitmap.createBitmap(mutableforegdimg1);//cuts out foreground info into bkgdimage (54.43MB) +6.11

imgCanvas1 = new Canvas(compositeImage1); //canvas references puzzle cut out image (54.43MB) +0
imgCanvas1.drawBitmap(croppedBmp, null, new Rect(0, 0, 1500, 2000), paintObject);//places puzzle image on canvas (54.43MB) +0

img1.setImageBitmap(compositeImage1);

}

代替

void bm_PuzzleOne()
{
//start of 1st puzzle

foregdimg1 = BitmapFactory.decodeResource(getResources(), R.drawable.puzzlepieceprac);//puzzle cut out (42.48MB) +6.15
mutableforegdimg1 = foregdimg1.copy(Bitmap.Config.ARGB_8888, true); //(48.32MB) +5.84

compositeImage1 = Bitmap.createBitmap(mutableforegdimg1);//cuts out foreground info into bkgdimage (54.43MB) +6.11

imgCanvas1 = new Canvas(compositeImage1); //canvas references puzzle cut out image (54.43MB) +0
imgCanvas1.drawBitmap(croppedBmp, null, new Rect(0, 0, 1500, 2000), paintObject);//places puzzle image on canvas (54.43MB) +0

img1.setImageBitmap(compositeImage1);

}

关于android - 如何在不耗尽内存的情况下在 droid 中制作益智应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35706406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com