android - 无法使用 WRAP_CONTENT 作为高度和宽度动态添加自定义视图
问题描述
我正在尝试将多个自定义视图添加到框架布局,但它总是占用框架布局的整个宽度和高度。自定义视图只包含一个 50x50 的图像,我希望它能够在框架布局中移动,但由于自定义视图占据了整个空间并相互重叠,我无法选择其他自定义视图,因此我希望将其包裹起来。
这是我添加自定义视图的方式:
OverlayView overlayView = new OverlayView(EditorActivity.this, themeFilter.drawable);
frameLayout.addView(overlayView, 1, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT));
这是 OverlayView :
public class OverlayView extends View {
Bitmap bitmap;
float x,y;
float centerX, centerY;
public OverlayView(Context context, int drawable) {
super(context);
bitmap = BitmapFactory.decodeResource(context.getResources(), drawable);
centerX = (float)getWidth() /2;
centerY = (float)getHeight() /2;
x = centerX;
y = centerY;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (x != centerX && y != centerY) {
canvas.drawBitmap(bitmap, x-bitmap.getWidth()/2, y-bitmap.getHeight()/2, null);
} else {
//INITIALIZE BITMAP ON CENTER OF SCREEN
canvas.drawBitmap(bitmap, (float)getWidth()/2 - bitmap.getWidth()/2, (float)getHeight()/2 -bitmap.getHeight()/2, null);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN :
break;
case MotionEvent.ACTION_MOVE :
x = event.getX();
y = event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP :
x = event.getX();
y = event.getY();
invalidate();
}
return true;
}
}
现在我在想的是保持原样。意思是,OverlayView 占据了整个屏幕,我只需要在其他 OverlayViews 之间切换焦点就可以移动它们(我什至不知道这是否可能——在堆叠的 OverlayViews 之间切换焦点)但我担心浪费的空间影响内存和性能,因为图像只有 50x50。
解决方案
OverlayView 的大小在 onMeasure() 中计算。试试这个实现:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int width = View.MeasureSpec.makeMeasureSpec(bitmap.getWidth(), MeasureSpec.EXACTLY);
int height = View.MeasureSpec.makeMeasureSpec(bitmap.getHeight(), MeasureSpec.EXACTLY);
setMeasuredDimension(width, height);
}
另请查看onMeasure的此实现。
推荐阅读
- python - 使用 str.contains 函数将列乘以
- algorithm - 流网络的二分匹配
- mysql - 在mysql中使用条件连接有条件地选择
- hadoop - 在 Windows Server 上实现 Keytab 文件
- autodesk-forge - Is it possible to get a webhook on BIM 360 model derivative jobs you did not create?
- python - 使用python远程到远程大文件复制
- c - LD 链接器脚本 EXCLUDE_FILE 不从文本部分排除目标文件
- c# - 有两个输入设备跟随光标的旋转和统一的新输入系统
- git - 如何从子分支直接提交到父分支?
- java - 有什么理由不在 Java 项目中使用新的 Kotlin 版本的库吗?