Страницы

Поиск по вопросам

Показаны сообщения с ярлыком material-design. Показать все сообщения
Показаны сообщения с ярлыком material-design. Показать все сообщения

вторник, 7 апреля 2020 г.

Выбор нескольких дат на Календаре

#java #android #material_design

                    
Я использую  библиотеку MaterialDateTimePicker
, и у меня два TextView (Откуда - Куда)... Так вот при нажатии на "Откуда", должен
открыться диалоговое окно с календарем и там выбираю одну дату. Потом при открытии
"Куда", предыдущая выбранная дата должна отображаться, то есть две даты выбираются.
У меня пока для каждого textView по диалогу... Просто мне кажется это неправильный подход.

Так вот хотел спросить, как использовать для обоих TextView один Диалог и при этом
получать два результата? Где именно копать?
    


Ответы

Ответ 1



Создайте локальную boolean переменную, назовите её, скажем, isFrom = false. При клике на кнопку/вьюшку, которая вызывается диалог для "откуда" присваивайте Вашей булевой переменной значение true. Для диалога "Куда", соответственно false устанавливайте обратно. По идее Dialog у Вас открывается примерно таким способом: private void showDatePickerDialog() { Calendar now = Calendar.getInstance(); DatePickerDialog dpd = DatePickerDialog.newInstance( CreateEventActivity.this, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) ); dpd.show(getFragmentManager(), "Datepickerdialog"); } Далее перекрываем onDateSet, в котором и будем смотреть в какое текстовое поле вставить значение @Override public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) { String month = String.valueOf(monthOfYear + 1); String day = String.valueOf(dayOfMonth); if (isFrom) fromTextView.setText(day + "." + (month) + "." + year); else whereTextView.setText(day + "." + (month) + "." + year); showTimePickerDialog(); }

воскресенье, 15 марта 2020 г.

Прозрачность в navigationBar

#java #android #material_design


Каким образом можно сделать прозрачность у Navigation Bar, как на картинке?



update:





    

    

    



    


Ответы

Ответ 1



Работает на api >= 19 Тема: Теперь мы можем указывать paddingBottom для ListView вместе с android:clipToPadding="false", иначе список будет перекрываться Navigation Barом. В обще это применительно ко всем элементам. Для корневых элементов активности я указываю paddingBottom с отрицательным значением = -navigationBarHeight, потом для дочерних делаю обратный отступ как в примере ниже. Пример: android:clipToPadding="false" - не обрезать элементы, выходящие за пределы размеров элемента. update: Стили: 28dp -28dp 72dp -72dp Разметка главной (Toolbar заменяет ActionBar) Как использовать Toolbar вместо ActionBar, наследуемся (начиная c 22.1) с android.support.v7.app.AppCompatActivity: Toolbar app_bar = (Toolbar) findViewById(R.id.app_bar); setSupportActionBar(app_bar); В общем это на изучения с конкретным работающим примером. Ссылку на google play выложить не могу, только завершается разработка версии 1.0.

суббота, 8 февраля 2020 г.

Как сделать Material Design Календарь на Android (см. скриншот)?

#android #интерфейс #material_design #toolbar




Как сделать такой Material Design Календарь под Android?  Есть ли какие-нибудь библиотеки?
Интересует именно дизайнерское решение. 
    


Ответы

Ответ 1



Всё, что на скриншоте сделано с помощью библиотеки Android Design Support Library от гугла. В данном случае эта разметка содержит: CoordinatorLayout, а в нём AppBar, а в нём CollapsingToolbarLayout, а в нём Toolbar и (наверное) GridView (для календаря) В CoordinatorLayout также еще RecyclerView (или ScrollView) и FloatingActionButton

среда, 22 января 2020 г.

Как сделать подпись у иконки в floating action button?

#java #android #android_studio #material_design


У меня есть Floating Action Button с Vector Drawable внутри. Можно ли под него вставить
текст? (не рядом с кнопкой, а внутри нее, как на картинке) 


    


Ответы

Ответ 1



Действительно в таком варианте самый очевидный и простой способ это нарисовать текст. Те ваш текст это и есть вектор. Плюсов много, но ести и минусы -> локализация. Если это для вас не критично, то смело создавайте такие VectorDrawable всё будет отлично работать. Если вы всетаки, хотите вставлять отдельно любой текст менять его, то можно сделать например так: Это будет работать, но минусов тоже хватает, вы должны следить за размером текста, за размером картинки, в теории это можно довести до более хорошего решения, и не забывайте что android:elevation="16dp" необходим, иначе текст будет под FAB. Можно переопределить FAB и onDraw и дорисовывать текст на Canvas, такой вариант имеет место быть.

понедельник, 6 января 2020 г.

Как изменить размер CardView с анимацией?

#android #android_sdk #material_design #android_ui


У меня есть layout в котором есть CardView внутри которого лежит, скажем, картинка.

Я хочу увеличить высоту и ширину этой CardView вместе с анимацией так как это делают
в Material Design Guidelines

Я пробовал 2 способа:


cardView.animate().scaleX().scaleY() - этот способ изменяет размер CardView но вместе
с ним и изменяется размер всего, что внутри его даже если у содержимого выставлена
специфичная ширина и высота;
можно сделать cardView.getLayoutParams() и потом изменить height и width или можно
добавить margin - это действительно меняет размер, но непонятно как это анимировать.


Весьма странно, но я не нашел никаких стоящих рецептов в гугле.
    


Ответы

Ответ 1



Можно воспользоваться вот этим способом с gitHub-а: Создаём анимацию изменения параметров View: public class ResizeAnimation extends Animation { final int startWidth; final int targetWidth; View view; public ResizeAnimation(View view, int targetWidth) { this.view = view; this.targetWidth = targetWidth; startWidth = view.getWidth(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { int newWidth = (int) (startWidth + (targetWidth - startWidth) * interpolatedTime); view.getLayoutParams().width = newWidth; view.requestLayout(); } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); } @Override public boolean willChangeBounds() { return true; } } Применяем её: ResizeAnimation resizeAnimation = new ResizeAnimation(view, targetSize); resizeAnimation.setDuration(600); view.startAnimation(resizeAnimation);

четверг, 2 января 2020 г.

разное поведение разметки для разных версий

#android #xml #android_sdk #material_design


К вопросам о поведении разметки в android - если в версиях после lolipop все работает
как нужно, а до lolipop разметка становится корявой, как это исправить?

Конкретно - есть список recyclerView, в нем items, так вот в версии после 5 все выглядит,
как нужно.

Если запускаю в версиях ниже (пробовал на 4.1.1 и 4.2), то индикатор, показывающий
количество лайков съезжает влево.

Разметка одна и та же, как такие баги исправляются вообще?Писать каким-то образом
отдельно под версии ниже 5-ой, я не понимаю.
    


Ответы

Ответ 1



Под такие случаи пишут layout.xml с таким же названием только для версии API выше т.е. написав layout.xml с корректным видом для более нового API, кладем его в папку с названием layout-v19, все что выше 19 версии включительно будет отображаться как сказано в этом layout

Ответ 2



Стоит изучить тему Предоставление альтернативных ресурсов, если проблемы связаны с объективными причинами, вроде иного парсинга одинаковых атрибутов на более новых API или иные параметры в теме, например вид и размер виджетов. В вашем случае альтернативный ресурс будет по версии API. Так же существует вероятность, что в разметке используются атрибуты, которые не поддерживаются в более старых API (вроде android:layout_marginStart поддерживается с API17). Такие атрибуты игнорируются при парсинге разметки на более старых API и своих функций, естественно, не выполняют.

суббота, 28 декабря 2019 г.

Меню под Toolbar. Нет названия табов

#android #material_design #menu #android_toolbar


Пытаюсь сделать так - 



Java код

//Pager
    TabsViewPagerAdapter adapter = new TabsViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new Fragment1(), "Первый");
    adapter.addFragment(new Fragment2(), "Second");
    viewPager.setAdapter(adapter);

    //Set tabs
    tabLayout.setupWithViewPager(viewPager);


Так же вот вам мой класс -

public class PagerAdapterHelper extends FragmentPagerAdapter {
private final List mFragmentList = new ArrayList<>();
private final List mFragmentTitleList = new ArrayList<>();

public PagerAdapterHelper(FragmentManager manager) {
    super(manager);
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}

public void addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
}


@Override
public CharSequence getPageTitle(int position) {
    switch (position) {
        case 0:
            return "ONE";
        case 1:
            return "TWO";
        default:
            return "WTF";
    }
}


}

После запуска Активити есть тулбар и поле под ним, но почему-то самих табов на нем
нет. Так же сами фрагменты спокойно отображаются/листаются. На табы можно тыкать, все
норм, только надписей нет(
    


Ответы

Ответ 1



Для этого применяются табы. Код разметки: Код добавления: Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); assert toolbar != null; setSupportActionBar(toolbar); viewPager = (ViewPager) findViewById(R.id.viewpager); tabLayout = (TabLayout) findViewById(R.id.tabs); TabsViewPagerAdapter adapter = new TabsViewPagerAdapter(getSupportFragmentManager()); adapter.addFragment(new Fragment1(), "ssss"); adapter.addFragment(new Fragment2(), "Second"); viewPager.setAdapter(adapter); viewPager.setAdapter(adapter); assert tabLayout != null; tabLayout.setupWithViewPager(viewPager); tabLayout.setupWithViewPager(viewPager); tabLayout.getTabAt(0).setText("1"); tabLayout.getTabAt(1).setText("2"); Код адаптера: public class TabsViewPagerAdapter extends FragmentPagerAdapter { private final List mFragmentList = new ArrayList<>(); private final List mFragmentTitleList = new ArrayList<>(); public TabsViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } public void addFragment(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } }

Ответ 2



build.gradle dependencies { compile 'com.android.support:design:23.1.1' } activity_pull_to_refresh.xml TabLayoutActivity.class public class TabLayoutActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pull_to_refresh); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); ViewPager viewPager = (ViewPager) findViewById(R.id.pager); if (toolbar != null) { setSupportActionBar(toolbar); } viewPager.setAdapter(new SectionPagerAdapter(getSupportFragmentManager())); tabLayout.setupWithViewPager(viewPager); } public class SectionPagerAdapter extends FragmentPagerAdapter { public SectionPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new FirstTabFragment(); case 1: default: return new SecondTabFragment(); } } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return "First Tab"; case 1: default: return "Second Tab"; } } } }

среда, 25 декабря 2019 г.

Выбор цветов для “ночной” темы

#android #gui #ui #color #material_design


Пишу погодное приложение. 

Для подбора цветов, чтобы следовать концепции Material Design, использовал ресурс
https://www.materialpalette.com/. 

Остановился на следующей цветовой схеме (см. рисунок ниже)

Сейчас решил добавить "ночную тему" (см рисунок ЕЩЕ ниже :-)

Я брал цвета "на глаз". 

Существуют какие-либо гайды или ресурсы для подбора цветов для ночных тем? Как правильно
подобрать цвета для ночной темы, следуя концепции Material Design?

Заранее спасибо




    


Ответы

Ответ 1



Нашел любопытную статейку по первому вопросу. Находим картинку в спокойных темных тонах Загружаем в pictaculous Profit

вторник, 24 декабря 2019 г.

Сложные UI элементы\анимации

#android #android_sdk #material_design #android_animation


Изредка бегло мониторю состояние рынка, и часто встречаю в вакансиях примерно следующее:
"Отличное знание UI и создание собственных сложных UI компонентов и анимаций"

Поскольку все книги по Android разработке ооочень быстро устаревают, и простые действия
с View (такие как скейл, исчезание, поворот на n-градусов и етс) как бы - просты. 

Так вот вопрос состоит в том, как приступить к изучению кастомного UI и кастомных
анимаций? На порталах вроде StartAndroid я находил лишь простые примеры, и на самом
деле есть множество способов анимирования. 

Однако многие из которых устарели или являются слишком простыми, не актуальными.

Мне бы хотелось перенять опыт, узнать - какими инструментами, и как происходит построение
грамотной верстки.
    


Ответы

Ответ 1



по UI и UX много информации в статьях и блогах. вот список статей, которые считаю полезными: неплохая статья по основам UX, чтобы знать что можно сделать, как это сделать правильно; гайдлайны матириал - тоже советую ознакомиться либы, фреймворки от гугл: Transition API, physics-based animation library, AnimatedVectorDrawable вот примеры сложных UI с кодом: https://proandroiddev.com/implementing-complex-animations-in-android-full-working-code-41979cc2369e https://yalantis.com/blog/how-we-created-a-multiselection-solution-for-android/?utm_source=androiddevdigest https://yalantis.com/blog/develop-filter-animation-kotlin-android/ http://saulmm.github.io/from-design-to-android-part1 https://medium.com/@saulmm2/from-design-to-android-part-2-2a6c141547d9 http://frogermcs.github.io/Instagram-with-Material-Design-concept-is-getting-real-the-summary/ полезные блоги и статьи: серия статей по переходам между экранами про кастомные вьюхи, основы неплохая статья про работу с ресурсами

воскресенье, 15 декабря 2019 г.

Разные отступы Floating Action Button(fab) в разных версиях Android

#android #material_design


Здраствуйте! 
Есть така проблема: нужно разместить 2 Floating Action Buttons c привязкой к правому
нижнему углу с задаваемым margin между ними. Наглядный пример - Google Maps.
Гугл привел меня к такой ссылке, где описано именно то, что мне нужно. Но делая по
примеру, я обнаружил, что на своем телефоне(скрин 1, android 4.2) и на другом (скрин
2, android 5.0.2) есть разбежности. Думаю, здесь нужно баловаться с dimens.xml and
styles.xml для каждой версии API(а различия между x<20 & x >= 20).  

Приведу код:

 




 

P.S. Как видите, разница большая. Интересует как указать margin между кнопками по
вертикали? Задавал их, но не работает(наверное через anchor).
    


Ответы

Ответ 1



Solution Взяв за основу ответ @shwarz-andrei, я начал экспериментировать со своей задачей. Итого, у меня получилось(хотя тестировал только на двух вышесказанных девайсах). И так, начнём. Для начала я обьявил константы в values/dimens.xml: 16dp 16dp 16dp 32dp 4dp ... в values-v21/dimens.xml соотвествено: 16dp 16dp 8dp 64dp 8dp Код разметки: Результат: всё заработало так, как мне нужно было, а именно - одинаковое отображение двух FAB на разных версиях Android(в моём случае - Android 4.2 и 5.0.1).

Ответ 2



Я такую задачу решил, программно задав положение кнопки для версий 5+: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { fab.setLayoutParams(getFabLayoutParams()); } private RelativeLayout.LayoutParams getFabLayoutParams() { RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp.addRule(RelativeLayout.ABOVE,fab2) lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); lp.bottomMargin = 20; lp.rightMargin = 20; return lp; } По умолчанию - margin=0 (для версий меньше 5ой отступ выставляется сам).

Ответ 3



CoordinatorLayout использует anchor, чем-то похоже на привязки как в RelativeLayout, попробуйте сделать кастомный разделитель, привязать (приякорить:) его к нижней fab, а второй fab2 уже к этому разделителю, вот такой пример: где высота divider и будет расстояние между двумя fab по вертикали.

четверг, 11 июля 2019 г.

elevation на старых API

Начиная с API 21 android:elevation дает очень красивый эффект тени. Как добиться такого же результата для более старых версий android?


Ответ

Можно попробовать использовать:
android:shadowColor, android:shadowDx, android:shadowDy, android:shadowRadius;
или
setShadowLayer()
Еще можно такое попробовать: В файл ресурсов добавить:
#FBFBFB #ff9e9e9e #7F000000 #FFFFFF

Пример TextView

Или: https://stackoverflow.com/questions/14463747/simple-layout-shadow-in-android

воскресенье, 7 июля 2019 г.

Упрощения триггера WPF

Добрый утро! Каким образом можно упростить данный триггер и какие замечания будут по данному коду?
...

пятница, 21 июня 2019 г.

Выбор нескольких дат на Календаре

Я использую библиотеку MaterialDateTimePicker , и у меня два TextView (Откуда - Куда)... Так вот при нажатии на "Откуда", должен открыться диалоговое окно с календарем и там выбираю одну дату. Потом при открытии "Куда", предыдущая выбранная дата должна отображаться, то есть две даты выбираются. У меня пока для каждого textView по диалогу... Просто мне кажется это неправильный подход.
Так вот хотел спросить, как использовать для обоих TextView один Диалог и при этом получать два результата? Где именно копать?


Ответ

Создайте локальную boolean переменную, назовите её, скажем, isFrom = false
При клике на кнопку/вьюшку, которая вызывается диалог для "откуда" присваивайте Вашей булевой переменной значение true. Для диалога "Куда", соответственно false устанавливайте обратно.
По идее Dialog у Вас открывается примерно таким способом:
private void showDatePickerDialog() { Calendar now = Calendar.getInstance(); DatePickerDialog dpd = DatePickerDialog.newInstance( CreateEventActivity.this, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) ); dpd.show(getFragmentManager(), "Datepickerdialog"); }
Далее перекрываем onDateSet, в котором и будем смотреть в какое текстовое поле вставить значение
@Override public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) { String month = String.valueOf(monthOfYear + 1); String day = String.valueOf(dayOfMonth); if (isFrom) fromTextView.setText(day + "." + (month) + "." + year); else whereTextView.setText(day + "." + (month) + "." + year); showTimePickerDialog(); }

понедельник, 17 июня 2019 г.

Градиент для статус бара


Статус бар в макете так же градиентный, пробовал просто цвет подогнать монотонный - не подходит, и дизайнера не устраивает.
Предложили использовать темно-серый, но вдруг можно.
Так можно ли в андроиде реализовать подобный функционал?
Ps. картинки больше найти не удалось, но надеюсь здесь всё видно.


Ответ

Сделать градиентный статус бар можно, установив для него полупрозрачноть
@Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window w = getWindow(); w.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); w.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
создать drawable с градиентом и установить его как background в toolbar
gradient_drawable.xml

среда, 12 июня 2019 г.

ListView перекрывает FloatingActionBar

Когда ListView перестает влазить в экран, он перекрывает fab, после чего кликнуть по fab уже не получается (пока ListView не "дошел" до fab - fab кликабелен). Все клики идут на элементы списка. На скрине видно, как разделители идут поверх fab.

Gradle
compile 'com.android.support:design:25.3.1'
XML






Фрейм используется для фрагментов
@Override public void setFragment(Fragment f) { getFragmentManager() .beginTransaction() .replace(R.id.main_frame, f) .commit();
Проблема только на эмуляторе (Genymotion, на нативном попробовать не могу). Эмулируется Nexus S API 16 480 x 800.
Физическое устр-во на котором все работает: Xiaomi API 21 1080 x 1920


Ответ

Да, есть такая проблема до API 21.
Суть её в том, что по факту, в вашей разметке FAB находится в контейнере на 0 уровне и все последующие добавляемые элементы перекрывают его (т.к. отрисовка детей в контейнере происходит по порядку их добавления, то самые последние имеют максимальный z-индекс) и, соответственно, клики не проходят. При этом с API 21 FAB всегда выше любой вьюхи в одном с ним контейнере.
У вас 3 варианта:
Установить программно z-индекс для FAB:

ViewCompat.setZ(fab, 42);
Переделать разметку так, чтобы FAB был всегда выше в иерархии чем фрагменты. Например сделав ещё один FrameLayout внутри текущего и в него фрагменты добавлять. Создать свой контейнер в котором реализовать свой порядок отрисовки детей. Пример тут: https://stackoverflow.com/a/39161932/3212712

среда, 5 июня 2019 г.

Прозрачность в navigationBar

Каким образом можно сделать прозрачность у Navigation Bar, как на картинке?

update:






Ответ

Работает на api >= 19
Тема:

Теперь мы можем указывать paddingBottom для ListView вместе с android:clipToPadding="false", иначе список будет перекрываться Navigation Barом. В обще это применительно ко всем элементам. Для корневых элементов активности я указываю paddingBottom с отрицательным значением = -navigationBarHeight, потом для дочерних делаю обратный отступ как в примере ниже.
Пример:

android:clipToPadding="false" - не обрезать элементы, выходящие за пределы размеров элемента.
update:

Стили:


28dp -28dp 72dp -72dp

Разметка главной (Toolbar заменяет ActionBar)











Как использовать Toolbar вместо ActionBar, наследуемся (начиная c 22.1) с android.support.v7.app.AppCompatActivity:
Toolbar app_bar = (Toolbar) findViewById(R.id.app_bar); setSupportActionBar(app_bar);
В общем это на изучения с конкретным работающим примером. Ссылку на google play выложить не могу, только завершается разработка версии 1.0.

пятница, 12 апреля 2019 г.

Как сделать Material Design Календарь на Android (см. скриншот)?


Как сделать такой Material Design Календарь под Android? Есть ли какие-нибудь библиотеки? Интересует именно дизайнерское решение.


Ответ

Всё, что на скриншоте сделано с помощью библиотеки Android Design Support Library от гугла.
В данном случае эта разметка содержит:
CoordinatorLayout, а в нём AppBar, а в нём CollapsingToolbarLayout, а в нём Toolbar и (наверное) GridView (для календаря) В CoordinatorLayout также еще RecyclerView (или ScrollView) и FloatingActionButton

четверг, 14 февраля 2019 г.

Как изменить размер CardView с анимацией?

У меня есть layout в котором есть CardView внутри которого лежит, скажем, картинка.
Я хочу увеличить высоту и ширину этой CardView вместе с анимацией так как это делают в Material Design Guidelines
Я пробовал 2 способа:
cardView.animate().scaleX().scaleY() - этот способ изменяет размер CardView но вместе с ним и изменяется размер всего, что внутри его даже если у содержимого выставлена специфичная ширина и высота; можно сделать cardView.getLayoutParams() и потом изменить height и width или можно добавить margin - это действительно меняет размер, но непонятно как это анимировать.
Весьма странно, но я не нашел никаких стоящих рецептов в гугле.


Ответ

Можно воспользоваться вот этим способом с gitHub-а:
Создаём анимацию изменения параметров View:
public class ResizeAnimation extends Animation { final int startWidth; final int targetWidth; View view;
public ResizeAnimation(View view, int targetWidth) { this.view = view; this.targetWidth = targetWidth; startWidth = view.getWidth(); }
@Override protected void applyTransformation(float interpolatedTime, Transformation t) { int newWidth = (int) (startWidth + (targetWidth - startWidth) * interpolatedTime); view.getLayoutParams().width = newWidth; view.requestLayout(); }
@Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); }
@Override public boolean willChangeBounds() { return true; } }
Применяем её:
ResizeAnimation resizeAnimation = new ResizeAnimation(view, targetSize); resizeAnimation.setDuration(600); view.startAnimation(resizeAnimation);

четверг, 10 января 2019 г.

разное поведение разметки для разных версий

К вопросам о поведении разметки в android - если в версиях после lolipop все работает как нужно, а до lolipop разметка становится корявой, как это исправить?
Конкретно - есть список recyclerView, в нем items, так вот в версии после 5 все выглядит, как нужно.
Если запускаю в версиях ниже (пробовал на 4.1.1 и 4.2), то индикатор, показывающий количество лайков съезжает влево.
Разметка одна и та же, как такие баги исправляются вообще?Писать каким-то образом отдельно под версии ниже 5-ой, я не понимаю.


Ответ

Под такие случаи пишут layout.xml с таким же названием только для версии API выше т.е. написав layout.xml с корректным видом для более нового API, кладем его в папку с названием layout-v19, все что выше 19 версии включительно будет отображаться как сказано в этом layout

вторник, 27 ноября 2018 г.

Сложные UI элементы\анимации

Изредка бегло мониторю состояние рынка, и часто встречаю в вакансиях примерно следующее: "Отличное знание UI и создание собственных сложных UI компонентов и анимаций"
Поскольку все книги по Android разработке ооочень быстро устаревают, и простые действия с View (такие как скейл, исчезание, поворот на n-градусов и етс) как бы - просты.
Так вот вопрос состоит в том, как приступить к изучению кастомного UI и кастомных анимаций? На порталах вроде StartAndroid я находил лишь простые примеры, и на самом деле есть множество способов анимирования.
Однако многие из которых устарели или являются слишком простыми, не актуальными.
Мне бы хотелось перенять опыт, узнать - какими инструментами, и как происходит построение грамотной верстки.


Ответ

по UI и UX много информации в статьях и блогах. вот список статей, которые считаю полезными:
неплохая статья по основам UX, чтобы знать что можно сделать, как это сделать правильно;
гайдлайны матириал - тоже советую ознакомиться
либы, фреймворки от гугл:
Transition API
physics-based animation library
AnimatedVectorDrawable
вот примеры сложных UI с кодом:
https://proandroiddev.com/implementing-complex-animations-in-android-full-working-code-41979cc2369e
https://yalantis.com/blog/how-we-created-a-multiselection-solution-for-android/?utm_source=androiddevdigest
https://yalantis.com/blog/develop-filter-animation-kotlin-android/
http://saulmm.github.io/from-design-to-android-part1
https://medium.com/@saulmm2/from-design-to-android-part-2-2a6c141547d9
http://frogermcs.github.io/Instagram-with-Material-Design-concept-is-getting-real-the-summary/
полезные блоги и статьи:
серия статей по переходам между экранами
про кастомные вьюхи, основы
неплохая статья про работу с ресурсами