Непонятно, какой набор координат вы используете. Судя по всему, значения x верны, но значения y отключены. (Вы вычисляете координаты экрана и используете их для рисования? Это даст вам правильные x
значения, но неправильные y
значения.) Убедитесь, что ваши координаты drawLine()
установлены правильно: вычисления для x
идет к x
координате и то же самое для y
.
Также не ясно, что происходит в LayoutCustom
, поэтому что-то может происходить там. Любые переводы координат могут сбить вас с толку.
Вот краткий пример, который может помочь вам в зависимости от вашего макета. Я использую View.setForeground()
(API 23+) для записи на холст, но концепция остается прежней.
![enter image description here](https://i.stack.imgur.com/4z3Kj.png)
activity_main.xml
<android.support.constraint.ConstraintLayout
android:id="@+id/mylayoutcustom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:fitsSystemWindows="true">
<Button
android:id="@+id/MainCOPbtn"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="@id/guideline2"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_max="@dimen/max"
app:layout_constraintHorizontal_bias="0.14"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/guideline"
app:layout_constraintWidth_default="wrap"
app:layout_constraintWidth_max="@dimen/max" />
<Button
android:id="@+id/x21"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@android:color/holo_blue_light"
app:layout_constraintBottom_toTopOf="@+id/x22"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_max="@dimen/maxsmall"
app:layout_constraintHorizontal_bias="0.4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/guideline"
app:layout_constraintVertical_chainStyle="spread"
app:layout_constraintWidth_default="wrap"
app:layout_constraintWidth_max="@dimen/maxsmall" />
<Button
android:id="@+id/x22"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@android:color/holo_blue_light"
app:layout_constraintBottom_toTopOf="@+id/x23"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/x21"
app:layout_constraintWidth_default="wrap"
app:layout_constraintWidth_max="@dimen/maxsmall" />
<Button
android:id="@+id/x23"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@android:color/holo_blue_light"
app:layout_constraintBottom_toTopOf="@id/x24"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/x22"
app:layout_constraintWidth_default="wrap"
app:layout_constraintWidth_max="@dimen/maxsmall" />
<Button
android:id="@+id/x24"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:background="@android:color/holo_blue_light"
app:layout_constraintBottom_toBottomOf="@id/guideline2"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/x23"
app:layout_constraintWidth_default="wrap"
app:layout_constraintWidth_max="@dimen/maxsmall" />
<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="16dp" />
<android.support.constraint.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="382dp" />
</android.support.constraint.ConstraintLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener {
private ConstraintLayout mLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLayout = findViewById(R.id.mylayoutcustom);
findViewById(R.id.mylayoutcustom).getViewTreeObserver()
.addOnGlobalLayoutListener(this);
}
@Override
public void onGlobalLayout() {
Button btns[] = new Button[]{
findViewById(R.id.MainCOPbtn),
findViewById(R.id.x21),
findViewById(R.id.x22),
findViewById(R.id.x23),
findViewById(R.id.x24)};
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStrokeWidth(10);
mLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Bitmap bmp = Bitmap.createBitmap(mLayout.getWidth(), mLayout.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
drawCircle(canvas, btns[0], paint);
for (int i = 1; i < btns.length; i++) {
drawLine(canvas, btns[0], btns[i], paint);
}
BitmapDrawable d = new BitmapDrawable(getResources(), bmp);
mLayout.setForeground(d);
}
private void drawLine(Canvas canvas, View fromView, View toView, Paint paint) {
Point from = getCenter(fromView);
Point to = getCenter(toView);
canvas.drawCircle(to.x, to.y, 20, paint);
canvas.drawLine(from.x, from.y, to.x, to.y, paint);
}
private void drawCircle(Canvas canvas, View view, Paint paint) {
Point center = getCenter(view);
canvas.drawCircle(center.x, center.y, 20, paint);
}
Point getCenter(View view) {
Point pt = new Point();
pt.x = (int) (view.getX() + view.getWidth() / 2);
pt.y = (int) (view.getY() + view.getHeight() / 2);
return pt;
}
}