【问题标题】:Unable to fill imageview by bitmap, weird behavior无法通过位图填充图像视图,奇怪的行为
【发布时间】:2014-03-11 14:40:59
【问题描述】:

简单的布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0099cc"
tools:context="com.testzoom.app.FullscreenActivity">

<TextView android:id="@+id/fullscreen_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true"
    android:textColor="#33b5e5"
    android:textStyle="bold"
    android:textSize="50sp"
    android:gravity="center"
    android:text="@string/dummy_content" />

    <Button android:id="@+id/dummy_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/dummy_button"
            android:layout_gravity="bottom"
            />

    <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:id="@+id/dummy_image"
            />

</FrameLayout>

目标 - 通过按下底部的按钮,将图像视图(与屏幕大小相同)设置为一半大小的截图位图。结果 - 奇怪的渲染,为什么 fitXY 不起作用?

点击处理程序:

findViewById(R.id.dummy_button).setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            View view = getWindow().getDecorView();

            Bitmap bmp = Bitmap.createBitmap(view.getWidth()/2, view.getHeight()/2, Bitmap.Config.ARGB_8888);

            Canvas c = new Canvas(bmp);
            c.scale(0.5f,0.5f, bmp.getWidth(), bmp.getHeight());
            view.draw(c);

            ((ImageView)findViewById(R.id.dummy_image)).setImageBitmap(bmp);
        }
    });

截图结果:


请注意,这个任务是合成的,所以不要问我为什么要这样做,这只是问题的演示。

【问题讨论】:

    标签: android android-layout bitmap imageview


    【解决方案1】:

    问题在于您正在缩放画布的调用。您提供的轴心点是 bmp.getWidth() 和 bmp.getHeight(),它们基本上位于屏幕中间。

    findViewById(R.id.dummy_button).setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                View view = getWindow().getDecorView();
    
                Bitmap bmp = Bitmap.createBitmap(view.getWidth()/2, view.getHeight()/2, Bitmap.Config.ARGB_8888);
    
                Canvas c = new Canvas(bmp);
                c.scale(0.5f,0.5f);//no pivot points 
                view.draw(c);
    
                ((ImageView)findViewById(R.id.dummy_image)).setImageBitmap(bmp);
            }
        });
    

    【讨论】:

    • 谢谢,就像一个魅力。我不知道为什么我将枢轴点移动到屏幕中心:)
    【解决方案2】:

    我认为与其说是渲染不如说是放置新的 ImageView。您在 FrameLayout 中拥有所有三个项目,这对确定视图的顺序或位置没有任何作用。放置新创建的 ImageView 的代码在哪里?

    【讨论】:

    • 没有创建新的 ImageView,imageView == R.id.dummy_image
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2019-01-10
    • 2014-08-25
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多