将ImageView添加到类的父Activity

时间:2013-04-09 21:04:47

标签: android position imageview parent

我想创建一个灵活的类,我可以放入我创建的任何项目中。该类将生成一个图像(最终,来自服务器的图像)并将其放在调用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没有设置布局。

非常感谢

2 个答案:

答案 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();

再次感谢所有建议!