Android Wear Watch Face: альтернатива onDraw() в WatchFaceService?

как описано здесь (https://developer.android.com/training/wearables/watch-faces/service.html), чтобы нарисовать циферблат, я должен использовать метод OnDraw, верно? альтернатив нет?

это шутка? нет макета из управления xml? нет управления dpi? нет управления форматом экрана? и т.д. и т.п.?

В самом деле?

Пожалуйста, скажи мне, что я ошибаюсь!

PS эта страница (http://www.binpress.com/tutorial/how-to-create-a-custom-android-wear-watch-face/120) сделать циферблат с помощью обычной активности, правильно это или нет?


person Xan    schedule 01.01.2015    source источник


Ответы (2)


В onCreateEngine() вашего WatchFaceService получите инфлятор:

mInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

затем в onCreate() вашего движка раздуйте макет:

mFrameLayout = (FrameLayout) mInflater.inflate(R.layout.main, null);

затем в onDraw() измерьте, разместите и нарисуйте представление:

        //Measure the view at the exact dimensions (otherwise the text won't center correctly)
        int widthSpec = View.MeasureSpec.makeMeasureSpec(bounds.width(), View.MeasureSpec.EXACTLY);
        int heightSpec = View.MeasureSpec.makeMeasureSpec(bounds.height(), View.MeasureSpec.EXACTLY);
        mFrameLayout.measure(widthSpec, heightSpec);

        //Lay the view out at the rect width and height
        mFrameLayout.layout(0, 0, bounds.width(), bounds.height());

        mFrameLayout.draw(canvas);

Только не ожидайте сделать это с TextClock. Его нет на Android Wear. Судя по всему, Google не ожидал, что разработчики захотят отображать часы на циферблате!

person user1210205    schedule 04.01.2015
comment
кажется необходимым добавить это в начале: canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); - person Xan; 07.01.2015

Вы правы, вы должны использовать Canvas или OpenGL. В приведенной вами ссылке объясняется старый обходной путь, работающий для версии до 5.0. Теперь вам нужно использовать новый API.

person Nicolas POMEPUY    schedule 01.01.2015
comment
это безумие! когда через несколько лет появятся устройства с другим разрешением? - person Xan; 01.01.2015
comment
Я не вижу никакой проблемы. API предоставляет вам всю информацию, необходимую для правильного отображения циферблата. - person Nicolas POMEPUY; 01.01.2015
comment
да, но мне нужно сделать все программно! Добро пожаловать в 90-е. - person Xan; 01.01.2015
comment
@Xan, что такого особенного в том, что вам нужно рисовать циферблат с помощью Canvas API? CanvasWatchFaceService.Engine похож на WallpaperService.Engine, и в API обоев у вас нет никаких средств управления, упомянутых в исходном вопросе. - person pskink; 01.01.2015
comment
никогда не делал WallpaperService. Я очень удивлен этим, сильная сторона Android — это SDK, который позволяет легко создавать интерфейсы, подходящие для всех экранов (плотность и размер). Я не понимаю причины такого выбора. экономить батарею? - person Xan; 01.01.2015
comment
вы все еще можете использовать макеты xml: v = LayoutInflater.from(context).inflate(R.layout.xxxx, null) затем вы можете вызвать v.measure() и v.layout() и, наконец, v.draw() в методе onDraw() - person pskink; 01.01.2015