Android Дичь - ещё один розыгрыш билета на Saint AppsConf

Android Дичь - ещё один розыгрыш билета на Saint AppsConf

Alexey Mileev
Чтобы выиграть билет, нужно прислать мне сниппет очень хорошего кода. Вот чтобы смотришь на него, и душа радуется. Читаешь его, а по телу разливается доброта. Показываешь его маме, а её разбирает гордость. Вот такой хороший кусок кода нужно прислать. Ну и добавить каких-то пояснений, если не сразу понятно, откуда он и зачем.

Победил @a_jukov.

Лучшее из того, что прислали:


and

SQLite. Тестирует Random() на повторы. Спойлер - bigint рулит.

Сниппет прекрасен! Блин, опять с него протащился)

-- the number of repetitions of the random number generator.

-- 1) BIGINT: 0 (!!) repeties for 100 000 000 (!!!) iterations
WITH RECURSIVE
  cnt(x) AS (
     SELECT ABS(RANDOM())
     UNION ALL
     SELECT ABS(RANDOM()) FROM cnt
      LIMIT 100000
  )
SELECT x, Count(x) as count_rand FROM cnt GROUP BY x HAVING count_rand > 1;

-- 2) INTEGER: 2-3 repeties for 100 000 iterations. 200-250 repeties for 100 000 000 iterations.
WITH RECURSIVE
  cnt(x) AS (
     SELECT ABS(RANDOM()) % (2147483647 - 1) + 1
     UNION ALL
     SELECT ABS(RANDOM()) % (2147483647 - 1) + 1 FROM cnt
      LIMIT 1000000
  )
SELECT x, Count(x) as count_rand FROM cnt GROUP BY x HAVING count_rand > 1;


@axrorxoja_yodgorov

Hi,It's not my code but very funny for me


@zaoroman

Это десять строк, заполняющих интерактивную шахматку (схематичное расположение квартир на плане дома) в приложении, которое мы разрабатывали для агентств недвижимости. 🙂

CardView addCardVew(int row, int coll, int rowSpan, int collSpan, @LayoutRes int resId) {
       rowSpan = rowSpan == 0 ? 1 : rowSpan;
       collSpan = collSpan == 0 ? 1 : collSpan;

       CardView cardView = (CardView) LayoutInflater.from(getContext()).inflate(resId, binding.chess, false);
       binding.chess.addView(cardView);
       GridLayout.LayoutParams p = (GridLayout.LayoutParams) cardView.getLayoutParams();
       p.setGravity(Gravity.FILL);
       p.rowSpec = GridLayout.spec(row, rowSpan, 1f);
       p.columnSpec = GridLayout.spec(coll, collSpan, 1f);

       return cardView;
   }


@a_jukov

Этот enum отвечает за определение местоположения заголовка для точки внутри определенной области. В нем же и расчитываются координаты. Причем так, что если точка находится близко к краю области, заголовок смещается, чтобы он полностью отобразился (прикрепил скриншот чтобы было нагляднее).

Чтобы избавиться от условных операторов в коде, решил переместить логику расчета двух главных переменных — left и bottom заголовка в отдельные private enum'ы. По-моему получилось неплохо.

enum class LabelPosition(private val vertical: Vertical, private val horizontal: Horizontal) {
    TOP_LEFT(Vertical.TOP, Horizontal.LEFT),
    TOP_RIGHT(Vertical.TOP, Horizontal.RIGHT),
    TOP_CENTER(Vertical.TOP, Horizontal.CENTER),
    BOTTOM_LEFT(Vertical.BOTTOM, Horizontal.LEFT),
    BOTTOM_RIGHT(Vertical.BOTTOM, Horizontal.RIGHT),
    BOTTOM_CENTER(Vertical.BOTTOM, Horizontal.CENTER);

    fun createLabelPositionRect(
        area: RectF,
        width: Float,
        height: Float,
        x: Float,
        y: Float,
        margin: Float,
        padding: Float
    ): RectF {
        val bottom = vertical.getBottom(area, height, y, margin)
        val top = bottom - height
        val left = horizontal.getLeft(area, width, x, margin, padding)
        val right = getLabelRight(left, width, padding)

        return RectF(left, top, right, bottom)
    }

    private fun getLabelRight(left: Float, width: Float, padding: Float): Float =
        left + width + padding

    private enum class Vertical {
        TOP {
            override fun getBottom(
                area: RectF,
                height: Float,
                y: Float,
                margin: Float
            ): Float = max(y - margin, area.top + height)
        },
        BOTTOM {
            override fun getBottom(
                area: RectF,
                height: Float,
                y: Float,
                margin: Float
            ): Float = min(y + margin + height, area.bottom - margin / 2)
        };

        abstract fun getBottom(
            area: RectF,
            height: Float,
            y: Float,
            margin: Float
        ): Float
    }

    private enum class Horizontal {
        LEFT {
            override fun getLeft(
                area: RectF,
                width: Float,
                x: Float,
                margin: Float,
                padding: Float
            ): Float = max(x - margin - padding - width, area.left + margin / 2)
        },
        RIGHT {
            override fun getLeft(
                area: RectF,
                width: Float,
                x: Float,
                margin: Float,
                padding: Float
            ): Float = min(x + margin, area.right - GraphBase.yAxisLabelWidth - padding / 2 - width)
        },
        CENTER {
            override fun getLeft(
                area: RectF,
                width: Float,
                x: Float,
                margin: Float,
                padding: Float
            ): Float = max(
                0f + margin / 2,
                min(
                    x - width / 2 - padding / 2,
                    area.right - GraphBase.yAxisLabelWidth - margin - width
                )
            )
        };

        abstract fun getLeft(
            area: RectF,
            width: Float,
            x: Float,
            margin: Float,
            padding: Float
        ): Float
    }
}


Report Page