Android 根据ImageView的高度和宽度在onCreate()中创建缩放位图

Android 根据ImageView的高度和宽度在onCreate()中创建缩放位图,android,bitmap,imageview,Android,Bitmap,Imageview,这是我遇到的问题,在onCreate()中,我想首先将imageview设置为文件列表中的第一个图像,但使用imageview的宽度和高度,当它来回翻转时,将图像设置为imageview维度没有问题,但在onCreate()中我得到IllegalArgumentException宽度和高度必须大于0。如果在onCreate()idk中没有使用start方法,我会尝试使用该方法,非常感谢您的帮助,谢谢您抽出时间 public class ViewFlipperActivity extend

这是我遇到的问题,在onCreate()中,我想首先将imageview设置为文件列表中的第一个图像,但使用imageview的宽度和高度,当它来回翻转时,将图像设置为imageview维度没有问题,但在onCreate()中我得到IllegalArgumentException宽度和高度必须大于0。如果在onCreate()idk中没有使用start方法,我会尝试使用该方法,非常感谢您的帮助,谢谢您抽出时间

    public class ViewFlipperActivity extends Activity {

   ViewFlipper page;

   Animation animFlipInForeward;
   Animation animFlipOutForeward;
   Animation animFlipInBackward;
   Animation animFlipOutBackward;
   String[] imagefiles;
   File file = new File(Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES), "how");
   int filescount,nowcount;
   ImageView image;
   Matrix matrix;
   Bitmap d;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   imagefiles = file.list();
   filescount = imagefiles.length;
   nowcount = 0;
   matrix = new Matrix();
   matrix.postRotate(90);
   page = (ViewFlipper)findViewById(R.id.flipper);
   image = (ImageView)findViewById(R.id.zero);

   animFlipInForeward = AnimationUtils.loadAnimation(this, R.anim.left_in);
   animFlipOutForeward = AnimationUtils.loadAnimation(this, R.anim.left_out);
   animFlipInBackward = AnimationUtils.loadAnimation(this, R.anim.right_in);
   animFlipOutBackward = AnimationUtils.loadAnimation(this, R.anim.right_out);
   start();
   }
   private void start(){
   d = BitmapFactory.decodeFile(file.toString() +"/" + imagefiles[nowcount]);

   d = Bitmap.createBitmap(d, 0, 0, d.getWidth(), d.getHeight(), matrix, true);
   System.gc();
   d = Bitmap.createScaledBitmap(d, image.getWidth(), image.getHeight(), true);
   System.gc();
   image.setImageBitmap(d);
   System.gc();
   }

   private void SwipeRight(){
   page.setInAnimation(animFlipInBackward);
   page.setOutAnimation(animFlipOutBackward);
   nowcount--;
   if(nowcount < 0)
 nowcount = filescount - 1;
   d = BitmapFactory.decodeFile(file.toString() +"/" + imagefiles[nowcount]);

   d = Bitmap.createBitmap(d, 0, 0, d.getWidth(), d.getHeight(), matrix, true);
   System.gc();
   d = Bitmap.createScaledBitmap(d, image.getWidth(), image.getHeight(), true);
   System.gc();
   image.setImageBitmap(d);
   System.gc();

   page.showPrevious();
   Log.d("show previous", "exe");
   }

   private void SwipeLeft(){
   page.setInAnimation(animFlipInForeward);
   page.setOutAnimation(animFlipOutForeward);
   nowcount++;
   if(nowcount > 3)
 nowcount = 0;
   d = BitmapFactory.decodeFile(file.toString() +"/" + imagefiles[nowcount]);

   d = Bitmap.createBitmap(d, 0, 0, d.getWidth(), d.getHeight(), matrix, true);
   System.gc();
   d = Bitmap.createScaledBitmap(d, image.getWidth(), image.getHeight(), true);
   System.gc();
   image.setImageBitmap(d);
   System.gc();
   page.showNext();
   Log.d("show next", "exe");
   }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
   // TODO Auto-generated method stub
  return gestureDetector.onTouchEvent(event);
  }

  SimpleOnGestureListener simpleOnGestureListener
  = new SimpleOnGestureListener(){

  @Override
   public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  float velocityY) {

  float sensitvity = 50;
  if((e1.getX() - e2.getX()) > sensitvity){
   SwipeLeft();
  }else if((e2.getX() - e1.getX()) > sensitvity){
  SwipeRight();
  }

  return true;
  }

  };

  GestureDetector gestureDetector
  = new GestureDetector(simpleOnGestureListener);
  }
公共类ViewFlipperActivity扩展活动{
浏览页面;
动画动画;信息流;
动画向外展;
动画动画反向翻转;
动画动画倒转;
字符串[]图像文件;
File File=新文件(Environment.getExternalStoragePublicDirectory(
环境.目录(图片),"如何";;
int filescont,nowcount;
图像视图图像;
矩阵;
位图d;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imagefiles=file.list();
filescont=imagefiles.length;
nowcount=0;
矩阵=新矩阵();
矩阵旋转后(90);
页面=(ViewFlipper)findViewById(R.id.flipper);
image=(ImageView)findViewById(R.id.zero);
animFlipInformeWard=AnimationUtils.loadAnimation(这个,R.anim.left_in);
animFlipOutforead=AnimationUtils.loadAnimation(这个,R.anim.left\u);
animFlipInBackward=AnimationUtils.loadAnimation(这个,R.anim.right\u in);
animFlipOutBackward=AnimationUtils.loadAnimation(this,R.anim.right\u out);
start();
}
私有void start(){
d=位图工厂.decodeFile(file.toString()+“/”+imagefiles[nowcount]);
d=Bitmap.createBitmap(d,0,0,d.getWidth(),d.getHeight(),matrix,true);
gc();
d=位图.createScaledBitmap(d,image.getWidth(),image.getHeight(),true);
gc();
设置图像位图(d);
gc();
}
私人无效SwipeRight(){
第页:设置无生气(动画反向);
page.setOutAnimation(animFlipOutBackward);
现在计数--;
如果(现在计数<0)
nowcount=filescount-1;
d=位图工厂.decodeFile(file.toString()+“/”+imagefiles[nowcount]);
d=Bitmap.createBitmap(d,0,0,d.getWidth(),d.getHeight(),matrix,true);
gc();
d=位图.createScaledBitmap(d,image.getWidth(),image.getHeight(),true);
gc();
设置图像位图(d);
gc();
page.showPrevious();
Log.d(“显示以前的”、“exe”);
}
私有无效SwipeLeft(){
第页设置无生气(动画信息向上);
第页:setOutAnimation(动画向前翻转);
nowcount++;
如果(现在计数>3)
nowcount=0;
d=位图工厂.decodeFile(file.toString()+“/”+imagefiles[nowcount]);
d=Bitmap.createBitmap(d,0,0,d.getWidth(),d.getHeight(),matrix,true);
gc();
d=位图.createScaledBitmap(d,image.getWidth(),image.getHeight(),true);
gc();
设置图像位图(d);
gc();
page.showNext();
Log.d(“显示下一个”、“exe”);
}
@凌驾
公共布尔onTouchEvent(运动事件){
//TODO自动生成的方法存根
返回gestureDetector.onTouchEvent(事件);
}
SimpleOnGestureListener SimpleOnGestureListener
=新的SimpleNogestureListener(){
@凌驾
公共布尔onFling(运动事件e1、运动事件e2、浮点速度X、,
浮动速度y){
浮感度=50;
if((e1.getX()-e2.getX())>sensitivity){
SwipeLeft();
}else if((e2.getX()-e1.getX())>sensitivity){
SwipeRight();
}
返回true;
}
};
手势检测器手势检测器
=新的手势检测器(simpleOnGestureListener);
}

仅当父视图请求布局时,才会计算图像视图的高度和宽度,这是在
onCreate
完成之后。您应该实现一个,并从中获取imageview的高度和宽度。你不应该在那里加载你的图像,但是,可以使用
AsyncTask
或其他方法在后台加载它。

谢谢,我现在要查看它,我从来没有使用过OnGlobalYoutListener,我现在要,我可以使用oncreate中的处理程序来设置初始位图吗?如果您想要imageview的占位符,然后在布局xml文件中定义它,则不需要处理程序。您的图像视图将显示占位符,直到您的背景完成加载位图并将其放置在图像视图中。如何定义占位符?我实现了OnGlobalLayoutListener并重写了该方法,我不完全确定该方法如何工作。请看一下示例应用程序,更具体地说,是如何实现该方法的示例。再次感谢,我通过查看您的链接、您的生活和学习了解了该方法,谢谢您的时间