Android 根据ImageView的高度和宽度在onCreate()中创建缩放位图
这是我遇到的问题,在onCreate()中,我想首先将imageview设置为文件列表中的第一个图像,但使用imageview的宽度和高度,当它来回翻转时,将图像设置为imageview维度没有问题,但在onCreate()中我得到IllegalArgumentException宽度和高度必须大于0。如果在onCreate()idk中没有使用start方法,我会尝试使用该方法,非常感谢您的帮助,谢谢您抽出时间Android 根据ImageView的高度和宽度在onCreate()中创建缩放位图,android,bitmap,imageview,Android,Bitmap,Imageview,这是我遇到的问题,在onCreate()中,我想首先将imageview设置为文件列表中的第一个图像,但使用imageview的宽度和高度,当它来回翻转时,将图像设置为imageview维度没有问题,但在onCreate()中我得到IllegalArgumentException宽度和高度必须大于0。如果在onCreate()idk中没有使用start方法,我会尝试使用该方法,非常感谢您的帮助,谢谢您抽出时间 public class ViewFlipperActivity extend
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并重写了该方法,我不完全确定该方法如何工作。请看一下示例应用程序,更具体地说,是如何实现该方法的示例。再次感谢,我通过查看您的链接、您的生活和学习了解了该方法,谢谢您的时间