Как добиться эффекта наклона на Android, как на Windows Phone?

Я хочу добиться эффекта наклона при нажатии кнопки на ОС Android.

Эффект наклона: не вся кнопка будет считаться нажатой. Должна быть нажата только та часть, которая имеет событие касания.

Возможно ли это на Android?

enter image description here

Ответ 1

Простым способом было бы использовать рисование холста для рисования четырехсторонних фигур.

Рассмотрим каждый 4 угла. "Нетронутый" прямоугольник будет в полном размере, а коснутый прямоугольник будет меньше.

Touched and untouched boxes

Вам просто нужно нарисовать свою четырехстороннюю форму, используя точку, которую вы вычисляете для каждой части прямоугольника. Вы можете получить позицию касания, а затем выяснить, сколько "веса" дать каждую точку.

чтобы рассчитать каждый угол, вам нужно выяснить, сколько "веса" дать коснутую координату и сколько "веса" дать нетронутую координату. Если вы коснетесь левого верхнего угла, этот угол будет использовать 100% касательной координаты, а остальные три угла будут использовать нетронутую координату.

touched top left corner

Если вы коснулись верхней середины, вы получите такую ​​форму:

touched top middle

Мы можем рассчитать углы для любого касания, вычислив, насколько далеко от угла ваше прикосновение

touched bottom left

    float untouchedXWeight1 = Math.abs(xt - x1)/width;
    //maximum of 1, minimum of 0

    float untouchedYWeight1 = Math.abs(yt - y1)/height;

    float untouchedWeight1 = (untouchedXWeight1 + untouchedYWeight1)/2;
    //also maximum of 1, minimum of 0

    float touchedWeight1 = 1 - untouchedWeight1;

поэтому с этими весами вы можете рассчитать свои позиции x и y для этого угла:

x1 = xUntouched1 * untouchedWeight + xTouched1 * touchedWeight1;
y1 = yUntouched1 * untouchedWeight + yTouched1 * touchedWeight1;

Затем сделайте аналогично для остальных 3 углов.

Ответ 2

Я создал первый черновик здесь: https://github.com/flavienlaurent/TiltEffect

На втором этапе я сделаю его пригодным для использования Button и т.д.

К несчастью, я не использовал очень хороший (но слишком математический для меня) ответ HalR