【问题标题】:How to add a bitmap to a view, then add that view to a viewgroup如何将位图添加到视图,然后将该视图添加到视图组
【发布时间】:2012-01-12 20:16:34
【问题描述】:

也许是一个简单的问题,但我有一个从 sdcard 上的文件夹中检索位图(相机)的活动。活动的自定义视图扩展了视图组。我想将位图添加到视图中,然后将该视图添加到视图组中,然后显示。最终会有多个视图以这种方式添加。对此的最佳做法是什么?例如,您是否会先获得活动以获取位图,然后在视图组文件中使用以下内容访问该位图。

bitmap bm = (ActivityName()getContext()).methodToGetBitmap();

位图可以添加到视图中,而视图又可以添加到视图组中然后显示。谢谢

[更新]活动

public class HorizontalPagerActivity extends Activity {


    private static final String TAG = "*********hpActivity";
    private Context mContext = this;
    File tempFile;
    byte [] imageArray;
    private Bitmap b = null;

     @Override 
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);



            setContentView(R.layout.hpview);
            final ViewGroup viewgroup = (ViewGroup)findViewById(R.id.hpview); 




            tempFile = new File(Environment.getExternalStorageDirectory().
                    getAbsolutePath() + "/"+"image.jpeg");

            imageArray = new byte[(int)tempFile.length()];





         try{

                InputStream is = new FileInputStream(tempFile);
                BufferedInputStream bis = new BufferedInputStream(is);
                DataInputStream dis = new DataInputStream(bis);


                int i = 0;

                while (dis.available() > 0 ) {
                imageArray[i] = dis.readByte();
                i++;
                }

                dis.close();


           } catch (Exception e) {

                   e.printStackTrace();
                }



           Bitmap bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length);
          // Bitmap b = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888);
           b = bm.copy(bm.getConfig(), true);

            if(b == null){
                Log.e(TAG, "b = null");
            }else{
                Log.e(TAG, "b =  not null");
            }






             Canvas canvas = new Canvas(b);
             Log.e(TAG, "canvas created");




             View view = new View(this);
             Log.e(TAG, "view created");
             LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT,
                        LayoutParams.FILL_PARENT);
                view.setLayoutParams(lp);
                view.draw(canvas);


             viewgroup.addView(view);
             Log.e(TAG, "view added to viewgroup");


             runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    viewgroup.postInvalidate();
                }
            });

             Log.e(TAG, " inval called on viewgroup");

             Log.e(TAG, "no of chidren = "+viewgroup.getChildCount());





     }


}

活动的视图是一个视图组。所以这是父视图。活动预处理位图,动态创建和添加视图。它还使用 runOnUiThread() 在父视图组上调用 invalidate。

【问题讨论】:

    标签: android view bitmap viewgroup


    【解决方案1】:

    获取父视图,然后动态地将视图附加到它。

    当然,活动必须进行预处理并将这些视图附加到视图组。理想情况下,这应该在 AsyncTask 中完成,以便您的活动可以处理其当前功能。当 AsyncTask 完成时,要么使用处理程序更新视图/追加,要么只在 ui 线程上运行更新 (runOnUIThread(...))。

    【讨论】:

    • 感谢您的回复。我已经更新了我的帖子。这是正确的路线吗?它不会在视图中显示位图。谢谢
    • 所以我动态添加到视图组的所有视图都会在 ui 线程上调用无效后自行绘制?在 viewgroup 类中我不需要做任何事情,比如覆盖 onDraw?
    • 只是另一个想法,我调用 view.draw(canvas);如果我将位图设置为可绘制然后使用 view.setBackgroundDrawable() 会更好吗?
    • 取决于您的情况,您可能只需要尝试一下,看看您是否喜欢它。如果您在技术上完成了这个问题,也不要忘记将其作为您的答案:D!
    • 我只是在寻找标准的做法,最佳实践。因此,如果在调用 runOnUiThread 之前获取父视图在活动中动态添加视图是最佳做法,那么我会听从您的建议。谢谢
    【解决方案2】:

    我只需要将视图更改为 ImageView 并且上面的代码有效。所以我认为 Jox 的建议是正确的.... 获取父视图组,然后动态添加视图。如果是图像,则使用 imageview。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多