我想创建一个灵活的类,我可以放入我创建的任何项目中。该类将生成一个图像(最终,来自服务器的图像)并将其放在调用Activity的视图上。
这个想法是:一个Activity创建这个类的实例,当我想显示图像时,我调用类的“show”方法,传递x和y坐标,以及宽度和高度,以及默认图像如果无法从服务器加载名称,则使用该名称。
我很难将我创建的ImageView设置为在父Activity中正确定位。我已经尝试了许多不同的方法,但到目前为止,这是我为课程所做的:
public class ImageProducer
{
//parent activity
Activity parentActivity;
public void show(int x, int y, int imageWidth, int imageHeight, String defaultImage)
{
Resources r = parentActivity.getResources();
String packageName = parentActivity.getPackageName();
String imagePath = packageName + ":drawable/" + defaultImage;
int rID = r.getIdentifier(imagePath,null,null);
ImageView v = new ImageView(parentActivity.getBaseContext());
v.setImageResource(rID);
v.setScaleType(ScaleType.FIT_CENTER);
AbsoluteLayout.LayoutParams lp = new AbsoluteLayout.LayoutParams(imageWidth, imageHeight, x, y);
v.setLayoutParams(lp);
parentActivity.addContentView(v, lp);
}
public ImageProducer(Activity a)
{
parentActivity = a;
}
}
图像显示在父Activity中,但始终将其自身定位在左上角。
关于如何在课堂上定位的任何想法?棘手的部分是父Activity没有设置布局。
非常感谢
答案 0 :(得分:1)
我有一两种方法可以考虑这样做。
您可以确保所有活动布局的根布局为RelativeLayout
,然后将视图添加到具有必要参数的视图中,以使其在视图中居中。这意味着布局是RelativeLayout
中的第一个孩子,并且您的图片被添加为第二个孩子,因此会出现在第一个孩子的顶部。
或
您可以通过扩展ViewGroup
来创建自己的布局管理器。您可能需要对其进行一些调整,但基本上这就是ViewGroup
的外观。
public class Article2 extends ViewGroup {
private View layout;
private ImageView theImage;
private Context ctx;
public Article2(Context context,View layout) {
super(context);
ctx = context;
this.layout = layout;
this.addView(layout);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
for(int i = 0;i<this.getChildCount();i++){
final View child = this.getChildAt(i);
measureChild(child, widthMeasureSpec, heightMeasureSpec);
}
setMeasuredDimension(widthSpecSize, heightSpecSize);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
layout.layout(left, top, right, bottom);
if(theImage!= null){
theImage.layout(right/2 - theImage.getMeasuredHeight()/2, bottom/2 -theImage.getMeasuredHeight()/2, right/2 + theImage.getMeasuredHeight()/2, bottom/2 + theImage.getMeasuredHeight()/2);
}
}
public void startImage(String url){
theImage = new ImageView(ctx);
new GetImage(url).execute();
}
private class GetImage extends AsyncTask<Void,Void,Boolean>{
String url=null;
public GetImage(String url){
this.url = url;
}
@Override
protected Boolean doInBackground(Void... arg0) {
if(url!=null&&url.length()>0){
try {
theImage.setImageBitmap(BitmapFactory.decodeStream((InputStream)new URL(url).getContent()));
} catch (MalformedURLException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}else{
return false;
}
}
@Override
protected void onPostExecute(Boolean addView){
if(addView){
addView(theImage);
}
}
}
}
修改强>
忘了添加如何使用上面的类。
在onCreate()
中,而不是将内容视图设置为类似的布局文件
setContentView(R.layout.MyLayout);
而不是这样做
Article2 article2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.MyLayout, null);
article2 = new Article2(this,v);
setContentView(article2);
}
通过这种方式,您需要将上面的5行放入每个活动中以使其正常工作
要显示图片,只需拨打parentActivity.article2.startImage(url)
,然后将图片放在您在屏幕中央显示的视图顶部
一个注意事项,我没有放任何东西来移除图像,一旦它被放置你可能只需要使用article2.removeViewAt(1)
但我没有测试过。
答案 1 :(得分:0)
仅供参考,以下是我最终要做的事情:我将ImageView添加到parentActivity,之后我抓住了指向布局参数的指针。 LayoutParams是FrameLayout,所以我必须设置重力,然后指定x和y值。这是我的代码的样子:
Resources r = parentActivity.getResources();
String packageName = parentActivity.getPackageName();
packageName+=":drawable/" + defaultImage;
int rID = r.getIdentifier(packageName,null,null);
ImageView v = new ImageView(parentActivity.getBaseContext());
v.setImageResource(rID);
parentActivity.addContentView(v, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) v.getLayoutParams();
lp.width=w;
lp.height=h;
lp.gravity=Gravity.LEFT | Gravity.TOP;
lp.leftMargin=x;
lp.topMargin=y;
v.setLayoutParams(lp);
v.requestLayout();
再次感谢所有建议!