0

作成するプロジェクトにドロップできる柔軟なクラスを作成したいと思います。このクラスは、画像 (最終的にはサーバーからの画像) を生成し、呼び出し元のアクティビティのビューに配置します。

アイデアは、アクティビティがこのクラスのインスタンスを作成し、画像を表示したいときに、クラスの「表示」メソッドを呼び出し、x 座標と y 座標、幅と高さ、および使用するデフォルトの画像名を渡すことです。サーバーからロードできない場合。

作成した ImageView を親アクティビティに適切に配置するのに苦労しています。さまざまなアプローチを試しましたが、これまでのところ、クラスで得たものは次のとおりです。

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;

    }
}

画像は親アクティビティに表示されますが、常に左上に配置されます。

クラス内から配置する方法についてのアイデアはありますか? 注意が必要なのは、親アクティビティにレイアウトが設定されていないことです。

どうもありがとう

4

2 に答える 2

1

これを行うには、1 つまたは 2 つの方法が考えられます。

すべてのアクティビティ レイアウトのルート レイアウトが であることを確認してRelativeLayoutから、必要なパラメーターを使用してビューをビューに追加し、ビューの中央に配置することができます。これは、レイアウトが の最初の子でRelativeLayoutあり、画像が 2 番目の子として追加されるため、最初の子の上に表示されることを意味します。

また

を拡張して、独自のレイアウト マネージャを作成します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)で、画面の中央に指定したビューの上に画像が配置されます

1つの注意点として、画像が配置されたら、おそらく使用する必要があるだけで、画像を削除するためにそこに何も入れてい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 に答える