作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新
此更新旨在澄清原始问题。我创建了自定义 View 来制作可点击的点。我这样做是为了确保我始终可以在不同的屏幕尺寸上将点定位在准确的位置。尽管自定义 View 只在屏幕的一小部分上有一个点,但它使整个屏幕都可以点击,因此无法点击其他部分。我在屏幕上放置了两个点,但由于一个点的 View 实际上占据了整个屏幕,因此无法单击另一个点。如何将自定义 View 的可点击区域限制为仅画有圆点的部分?
相关代码如下:
public class MainActivity extends AppCompatActivity {
final float dotScale = 0.3f;
Dot dot1, dot2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
RelativeLayout myLayout = (RelativeLayout) findViewById(R.id.mainView);
MyView myView = new MyView(this);
myLayout.addView(myView);
// Two dots are created.
dot1 = new Dot(this);
dot1.xOffset = 2.9f;
dot1.yOffset = 3.3f;
myLayout.addView(dot1);
dot2 = new Dot(this);
dot2.xOffset = -2.4f;
dot2.yOffset = 1.1f;
myLayout.addView(dot2);
// Makes dots clickable
dot1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!dot1.isClicked) {
dot1.animate().setDuration(300).setInterpolator(new AnticipateInterpolator())
.scaleXBy(dotScale).scaleYBy(dotScale).alpha(1.0f);
dot1.isClicked = true;
}
}
});
dot2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!dot2.isClicked) {
dot2.animate().setDuration(300).setInterpolator(new AnticipateInterpolator())
.scaleXBy(dotScale).scaleYBy(dotScale).alpha(1.0f);
dot2.isClicked = true;
}
}
});
}
.......
//custom view for Dots
class Dot extends View {
int radius;
float xOffset;
float yOffset;
boolean isClicked = false;
public Dot(Context context) {
super(context);
setClickable(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int x = getWidth();
int y = getHeight();
double ratio = (547d / 828d);
float circleX = (float)((x / 2) - (y * ratio) / xOffset);
float circleY = (float)(y / yOffset);
radius = (int)((float)y/13);
setPivotX(circleX);
setPivotY(circleY);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(circleX, circleY, radius, paint);
}
}
最佳答案
我解决了我自己的问题。用于创建每个点的 View 占据了整个屏幕,即使某些部分是透明的。有一种方法可以使点击透明区域不会注册。但是,这不是一个好的解决方案。我解决问题的方法是放弃自定义 View 的想法并切换到标准 View 。在我无法让标准 View 在不同的屏幕尺寸上正确排列之前。然而,在删除顶部菜单栏后,计算变得更容易,我能够进行计算,因此这些点始终会在所有屏幕尺寸上正确显示。下面是我用来创建允许点击的点的代码:
//get screen size
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;
height = metrics.heightPixels;
//create dots
dot1 = new View(this);
dot2 = new View(this);
dot1.setBackgroundResource(R.drawable.circle);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(height/7, height/7);
params.leftMargin = (int)((width / 2) - height * ratio / 2.6f);
params.topMargin = (int)(height / 4.6f);
myLayout.addView(dot1, params);
dot2.setBackgroundResource(R.drawable.circle);
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(height/7, height/7);
params2.leftMargin = (int)((width / 2) - height * ratio / -4.6f);
params2.topMargin = (int)(height / 1.4f);
myLayout.addView(dot2, params2);
关于java - Android - 使用自定义按钮的自定义 View 使整个屏幕都可以点击,而不仅仅是在按钮区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38003034/
我是一名优秀的程序员,十分优秀!