编辑我在PhotoSortrView.load()中注释掉了这段代码
if (this.maxX < SCREEN_MARGIN)
cx = SCREEN_MARGIN;
else if (this.minX > displayWidth - SCREEN_MARGIN)
cx = displayWidth - SCREEN_MARGIN;
if (this.maxY > SCREEN_MARGIN)
cy = SCREEN_MARGIN;
else if (this.minY > displayHeight - SCREEN_MARGIN)
cy = displayHeight - SCREEN_MARGIN;
现在它有效。这可能是一个黑客修复。专业修复可能在于检查minX和显示宽度,并查看它在屏幕上显示if语句的原因。也许它应该改为this.centreX而不是this.minX。那些if语句经常被解雇。无论如何评论它是有效的,我现在很高兴。谢谢。
我正在使用这个非常棒的库:https://code.google.com/p/android-multitouch-controller/特别是它提供的示例应用程序的PhotoSortrView类。我提供足够的代码供任何人尝试和帮助。
工作得很好。它可以通过触摸手势拖动,旋转和缩放我的图像。但是我经常离开我实现它的活动,选择新图像,然后添加图像并重新输入活动。好像它必须调用onPause()和onResume(),它们必须调用unloadImages()和loadImages(),否则会导致我的应用程序崩溃,因为它试图绘制null的图像。但是,它们会导致先前的图像每次都加载到屏幕上的不同位置。如果我不能调用这些图像,那么图像不会被卸载,只是有一个较慢的应用程序,但图像保持在他们的位置,或重复使用图像位置和比例信息,所以他们每次重新加载到相同的位置,这将是伟大的。这是代码。当我说我的活动时,所有这一切都发生在一个活动中。涉及的唯一其他类是PhotoSortrView。
我的活动类声明:
public class MyActivity extends Activity implements OnClickListener {
我的Activity.onPause():
@Override
protected void onPause() {
super.onPause();
photoSorter.unloadImages();
}
我的Activity.onResume():
@Override
protected void onResume() {
super.onResume();
photoSorter.loadImages(this);
}
PhotoSortrView类声明:
public class PhotoSortrView extends View implements MultiTouchObjectCanvas<PhotoSortrView.Img> {
PhotoSortrView.unloadImages():
/** Called by activity's onPause() method to free memory used for loading the images */
public void unloadImages() {
int n = mImages.size();
for (int i = 0; i < n; i++){
//this.imgX = mImages.get(i).getCenterX();
//this.imgY = mImages.get(i).getCenterY();
mImages.get(i).unload();
}
}
PhotoSortrView.loadImages()(注意这会调用PhotoSortrView.load())
/** Called by activity's onResume() method to load the images */
public void loadImages(Context context) {
Resources res = context.getResources();
int n = mImages.size();
for (int i = 0; i < n; i++)
mImages.get(i).load(res);
}
PhotoSortrView.load():
/** Called by activity's onResume() method to load the images */
public void load(Resources res) {
getMetrics(res);
this.drawable = res.getDrawable(resId);
this.width = drawable.getIntrinsicWidth();
this.height = drawable.getIntrinsicHeight();
float cx, cy, sx, sy;
if (firstLoad) {
cx = SCREEN_MARGIN + (float) (Math.random() * (displayWidth - 2 * SCREEN_MARGIN));
cy = SCREEN_MARGIN + (float) (Math.random() * (displayHeight - 2 * SCREEN_MARGIN));
float sc = (float) (Math.max(displayWidth, displayHeight) / (float) Math.max(width, height) * Math.random() * 0.3 + 0.2);
sx = sy = sc;
firstLoad = false;
} else {
// Reuse position and scale information if it is available
// FIXME this doesn't actually work because the whole activity is torn down and re-created on rotate
cx = this.centerX;
cy = this.centerY;
sx = this.scaleX;
sy = this.scaleY;
// Make sure the image is not off the screen after a screen rotation
if (this.maxX < SCREEN_MARGIN)
cx = SCREEN_MARGIN;
else if (this.minX > displayWidth - SCREEN_MARGIN)
cx = displayWidth - SCREEN_MARGIN;
if (this.maxY > SCREEN_MARGIN)
cy = SCREEN_MARGIN;
else if (this.minY > displayHeight - SCREEN_MARGIN)
cy = displayHeight - SCREEN_MARGIN;
}
setPos(cx, cy, sx, sy, 0.0f);
}
请注意PhotoSortrView.load()
它说“如果可用则重复使用位置和比例信息.FIXME这实际上不起作用,因为整个活动被拆除并在旋转时重新创建”。
现在我的应用程序不会实现屏幕旋转。它永远是肖像。我还没有实现这一点。然而,我测试了应用程序,而从未旋转过它,图像在重新加载时不保留其位置和比例。我应该首先只在我的应用程序中实现肖像,看看它是否有效?或者在第三方库中查找轮换代码并禁用它?或者尝试使用我自己的方法捕获图像位置和比例并将其应用于重新加载?我可以轻松获得图像位置。
我离开了myActivity:
private void chooseImages(int menuId) {
Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("menuId", menuId);
startActivityForResult(intent, 1);
}
我回来了:
@SuppressLint("NewApi")
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (1) : {
if (resultCode == Activity.RESULT_OK) {
//add LInearLayout
RelativeLayout myLInearLayout =(RelativeLayout) findViewById(R.id.layout);
//String newText = data.getStringExtra("imagePath");
int drawable = data.getIntExtra("imagePath", 0);
photoSorter.addDrawable(drawable, this);
//Log.d("tag", "I have set the text " + newText);
}
break;
}
}
}
我的活动onCreate:
PhotoSortrView photoSorter;
public static String getmProfilePicPath(){
return mProfilePicPath;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if( savedInstanceState != null ) {
Toast.makeText(this, savedInstanceState.getString("message"), Toast.LENGTH_LONG).show();
Log.d("message", savedInstanceState.getString("message"));
}
setContentView(R.layout.activity_dressing_room);
mDb = new dbhelper(this);
this.mName = getMname();
AppUser user = mDb.getAppUser(mName);
mProfilePicPath = user.getImagePath();
setBackgroundImage();
photoSorter = new PhotoSortrView(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
this.addContentView(photoSorter, params);
gd = new GestureDetector(this, new MyGestureDetector());
otl = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return gd.onTouchEvent(event);
}
};
photoSorter.setOnClickListener(this);
photoSorter.setOnTouchListener(otl);
}
答案 0 :(得分:0)
您应该使用活动onSaveInstanceState
来保存活动销毁时所需的任何信息,并且该信息将通过onCreate
中的包传递。
我不知道为什么你需要在每个onPause和onResume上执行此操作,但是,你能不卸载并重新加载图像吗?