0

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

非常感谢

4

2 回答 2

1

我可以想到一两种方法来做到这一点。

您可以确保所有活动布局的根布局是 a 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),但我还没有测试过。

于 2013-04-09T22:57:36.497 回答
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();

再次感谢所有建议!

于 2013-04-11T14:35:03.777 回答