Android 使用Nexus 4中添加的admob/amazon时视图扭曲/模糊

Android 使用Nexus 4中添加的admob/amazon时视图扭曲/模糊,android,view,admob,Android,View,Admob,在Nexus4中,当显示adds(admob或amazon)时,触摸屏幕添加和移动的视图会失真。如果没有显示广告,则视图没有问题。 模拟器或galaxy IV都没有任何问题 我认为这个问题可能与chrome渲染器及其egl驱动程序的使用有关,但不知道如何解决它 带有admob的测试视图代码: public class TestAdmob extends ViewGroup { private AdView adView; private Rect drawRect; pr

在Nexus4中,当显示adds(admob或amazon)时,触摸屏幕添加和移动的视图会失真。如果没有显示广告,则视图没有问题。 模拟器或galaxy IV都没有任何问题

我认为这个问题可能与chrome渲染器及其egl驱动程序的使用有关,但不知道如何解决它

带有admob的测试视图代码:

public class TestAdmob extends ViewGroup {
    private AdView adView;
    private Rect drawRect;
    private Test1 myView;

    public TestAdmob(Activity context, String adUnitId) {
        super(context);

        myView = new Test1(context);
        drawRect = new Rect(0, 0, 400, 400);

        adView = new AdView(context);
        adView.setAdSize(AdSize.SMART_BANNER);
        adView.setAdUnitId(adUnitId);
        adView.setAdListener(new AdListener() {
            public void onAdLoaded() {
                Log.d("Admob", "onAdLoaded");
                requestLayout();
            }
            public void onAdFailedToLoad(int errorCode) { Log.d("Admob", "failedToLoad " + errorCode); }
            public void onAdOpened() { Log.d("Admob", "adOpened"); }
            public void onAdClosed() { Log.d("Admob", "adClosed"); }
            public void onAdLeftApplication() { Log.d("Admob", "adLeftApp"); }
        });
        AdRequest adRequest = new AdRequest.Builder()
        .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
        .build();

        addView(adView);

        adView.loadAd(adRequest);

    }

    private int getHeightAd() {
        try { return adView.getAdSize().getHeightInPixels(adView.getContext()); }
        catch (Exception e) {
            e.printStackTrace();
            return 200;
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        adView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(getHeightAd(), MeasureSpec.EXACTLY));
    }
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        adView.layout(l, 0, r, getHeightAd());
        myView.layout(drawRect.left, drawRect.top, drawRect.right, drawRect.bottom);
    }

    @Override public boolean onTouchEvent(MotionEvent event) {
        drawRect.offsetTo((int)event.getX()-drawRect.width()/2, (int)event.getY()-drawRect.height()/2);
        switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            addView(myView);
            break;
        case MotionEvent.ACTION_MOVE:
            requestLayout();
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_OUTSIDE:
            removeView(myView);
        default:
            break;
        }
        return true;
    }
    private class Test1 extends View {
        Path path = new Path();
        Bitmap bitmap;

        public Test1(Context context) {
            super(context);
            bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.anImage);
        }


        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            path.moveTo(0, 0);
            path.lineTo(getWidth(), 0);
            path.lineTo(getWidth()/2, getHeight());
            path.moveTo(0, 0);
            canvas.clipPath(path);

            canvas.drawBitmap(bitmap, 0, 0, null);      }

    }
}
显示广告时的扭曲视图:

如果不是,应该是:


我终于找到了解决办法。基于,我修改了如下代码(添加了setLayer行):


运气好吗?我也有同样的问题。不,现在还没有解决方案:(这似乎只发生在设备4.4.3+上。甚至安卓L也有同样的问题。我有一个解决方案。我希望它也能为你工作。见下文。谢谢,这帮了大忙。
...
 }

 private class Test1 extends View {
    Path path = new Path();
    Bitmap bitmap;

    public Test1(Context context) {
        super(context);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable. anImage);
    }
...