我有以下层次结构:Activity
- > PopupWindow
- >CustomView
我PopupWindow
自己是一个方形,但透明,所以你可以看到活动坐在后台.这CustomView
是一个嵌入PopupWindow内部的圆圈.
到目前为止我取得的成就是
PopupWindow
触摸事件将被分派到活动.现在缺少的部分是将PopupWindow
在CustomView
(圆圈)内部发生的任何触摸事件发送到活动.
我已经知道如何感觉触摸是在我的圈子之外.我只是将它委托给Activity时遇到了问题.
在我,CustomView
我有以下内容onTouch
if (radiusTouch > maxRadius) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
在我的PopupWindow
我已经设置了以下,但它永远不会被调用:
popup.setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(TAG, "PopupWindow :: onTouch()");
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
还有什么我需要做的事情来将触摸事件一直委托给Activity?
我正在尝试实现一个使用圆角绘制自己的LinearLayout子类.根据我的研究,我设置setWillNotDraw(false)
并覆盖onDraw()
在画布上绘制一个圆角矩形:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), drawPaint, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
| Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
canvas.drawRoundRect(bounds, mCornerRadius, mCornerRadius, roundPaint);
canvas.restoreToCount(sc);
}
Run Code Online (Sandbox Code Playgroud)
哪里:
drawPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
drawPaint.setColor(0xffffffff);
drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundPaint.setColor(0xffffffff);
Run Code Online (Sandbox Code Playgroud)
DST_IN
这里似乎是正确的选择(根据APIDemos示例),但应该是透明的区域(圆形的)具有黑色背景,并且子项的角仍然可见.这是使用Android 4.2.2的Galaxy Nexus的结果:
任何提示?
编辑:这是我想要实现的,抱歉photoshopping的粗糙:)
编辑2:我向GitHub添加了一个可运行的示例项目:https://github.com/venator85/RoundClippingLayout
谢谢 ;)