Обладаю такой камерой. Для путешествий использую вместе с объективом SONY SEL28F20 Выходит очень легкая и компактная система.
Также эта тушка очень интересна наличием неплохих систем подсказок для ручной фокусировки и возможностью нацепить через переходник практически любой старый мануальный объектив. Например такой:
О — даже один минус есть. Т.е. кто-то предпочел-бы чтоб этого комментария здесь не было.
Хорошо если этот кто-то хоть что-то сделал для развития общества.
public class CleanAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final AdapterTypesMap typesMap = new AdapterTypesMap();
private List itemList; // TODO
public CleanAdapter() {
// Здесь компилятор следит чтоб ViewHolder соответствовал классу данных. Т.е. передача AdVo.class, ProgressViewHolder.class вызовет ошибку компиляции
typesMap.putItem(R.layout.cell_progress, R.layout.cell_progress, ProgressVo.class, ProgressViewHolder.class);
typesMap.putItem(R.layout.cell_ad, R.layout.cell_ad, AdVo.class, AdViewHolder.class);
typesMap.putItem(R.layout.cell_user, R.layout.cell_user, UserVo.class, UserViewHolder.class);
}
@Override
public int getItemCount() {
return itemList.size();
}
@Override
public int getItemViewType(int position) {
return typesMap.getItemViewType(itemList.get(position));
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return typesMap.createViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
typesMap.bindViewHolder(holder, itemList.get(position));
}
}
Класс AdapterTypesMap
public class AdapterTypesMap {
private final Map<Integer /* view type */, AdapterItemType> viewTypesMap = new HashMap<>();
private final Map<Class /* adapter list item class */, AdapterItemType> listItemTypesMap = new HashMap<>();
public <T, V extends ViewHolderBase<T>> void putItem(int viewType, int resourceId, Class<T> dataItemClass, Class<V> viewHolderClass) {
AdapterItemType adapterItemType = new AdapterItemType(viewType, resourceId, viewHolderClass);
listItemTypesMap.put(dataItemClass, adapterItemType);
viewTypesMap.put(viewType, adapterItemType);
}
public int getItemViewType(Object obj) {
return listItemTypesMap.get(obj).getViewType();
}
public RecyclerView.ViewHolder createViewHolder(ViewGroup parent, int viewType) {
return viewTypesMap.get(viewType).createViewHolder(parent);
}
public void bindViewHolder(RecyclerView.ViewHolder holder, Object obj) {
listItemTypesMap.get(obj).bind(holder, obj);
}
}
Интерфейс IAdapterItemType
public interface IAdapterItemType {
int getViewType();
RecyclerView.ViewHolder createViewHolder(ViewGroup parent);
void bind(RecyclerView.ViewHolder holder, Object item);
}
Реализация AdapterItemType
public class AdapterItemType<T extends ViewHolderBase> implements IAdapterItemType {
private final Class<T> viewHolderClass;
private final int viewType;
private final int resourceId;
public AdapterItemType(int viewType, int resourceId, Class<T> viewHolderClass) {
this.viewHolderClass = viewHolderClass;
this.viewType = viewType;
this.resourceId = resourceId;
}
@Override
public int getViewType() {
return viewType;
}
@Override
public ViewHolderBase createViewHolder(ViewGroup parent) {
try {
View view = LayoutInflater.from(parent.getContext()).inflate(resourceId, parent, false);
// здесь не обойтись без рефлексии
return viewHolderClass.getConstructor(View.class).newInstance(view);
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public void bind(RecyclerView.ViewHolder holder, Object item) {
ViewHolderBase holder2 = (ViewHolderBase) holder;
holder2.bind(item);
}
}
Базовый клас ViewHolderBase
public abstract class ViewHolderBase<T> extends RecyclerView.ViewHolder {
public ViewHolderBase(View itemView) {
super(itemView);
}
public abstract void bind(T item);
}
И по одному наследнику классу ViewHolderBase для соответствующих классов данных. Типа такого:
public class UserViewHolder extends ViewHolderBase<UserVo> {
public UserViewHolder(View itemView) {
super(itemView);
}
@Override
public void bind(UserVo item) {
// TODO
}
}
Еще один очевидный метод (и правильный с точки зрения ООП) это дать возможность элементу «обработать» себя самому.
Но это потребует расширения всех классов данных определенным интерфейсом, что может быть не очень удобным.
Рассмотренный метод мне нравится больше.
Хорошая новость. Использую закладки сбоку еще со времен Оперы и не понимаю как может быть по другому особенно на широкоформатных мониторах.
Важно понять что это «правильная» фича так же как например то что темные темы для приложений лучше светлых (они выглядят лучше и что более важно меньше влияют на зрение) и признать что прежний подход был ошибочным.
Кто-то понимает это быстрее, кто-то медленее, но это нормально.
Насчет скорости реакции — она зависит от частоты опроса датчика, задержки между-процессного взаимодействия и задержки обновления UI. Основной параметр все таки частота опроса датчика — и она задана как SENSOR_DELAY_FASTEST, что должно давать 100 Гц.
Здесь также есть возможности для улучшений путем переноса реализации алгоритма из отдельного приложения в драйвер датчика.
Какая реальная задержка — нужно еще подумать как это можно измерить.
Интерфейс был бы намного более отзывчивый если б Андроид поддерживал hover жесты. Тогда понять нажимается ли элемент можно было бы просто приблизив палец.
А ведь Sony давно реализовала такой тач скрин (технология Floating Touch).
"Любая проблема проектирования может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев" в действии.
Избежать ошибки «Activity to be started with KEY_INTENT must share Authenticator's signatures» можно если в манифесте аутентикактора в XML указать android:customTokens=«true». Интересен другой вопрос — как работать с AccountManager из бекграунд-сервиса (в частности как вызвать метод getAuthTokenByFeatures так чтоб он показал логин активити при необходимости)? Похоже без хаков с dummy активини не вийдет.
(наверное ответ достоин награды Necromancer :D )
Я перепробовал несколько блутуз модулей из алиекспресс для автомобиля и остановился на этом store3.sure-electronics.com/aa-ab41136-1681
Он выдает наилучшее качество. Наихудшее качество, которое невозможно слушать, и не понимаю как это можно продавать, выдает Belkin CarAudio Connect AUX with Bluetooth.
Остальные DIY модули заметно шумят.
Все правильно автор написал — он сравнил функционал Mac OS с другими системами и указал на вещи, которые в Mac OS реализованы хуже. То, что они там такие изначально ничего не значит в контексте сравнения.
Среди Windows/MacOS/Linux MacOS для меня стоит на последнем месте так как пользоваться «их» клавиатурой невозможно после стандартной клавиатуры. Хотите поиграть в закрытый клуб — получите (пишу из-под Ubuntu, MacMini валяется сбоку выключенным).
Я так понимаю задача MyTask — отложенное выполнение кода (изменение громкости). Если так, то это ужасное решение и антипаттерн.
Один из вариантов правильного решения — использовать Handler.
Почему так — ну тут лучше самому почитать больше о многопоточности.
Отличный пример того как можно испоганить иконку. Теперь она не передает оригинальной идеи так как объектив теперь не узнается. К тому же тень меняет Z порядок.
Все остальное нравится. Разве что сделал бы приложение более полноэкранным (заезжающим под статус бар и под навигейшн бар).
Также эта тушка очень интересна наличием неплохих систем подсказок для ручной фокусировки и возможностью нацепить через переходник практически любой старый мануальный объектив. Например такой:
Хорошо если этот кто-то хоть что-то сделал для развития общества.
Но это потребует расширения всех классов данных определенным интерфейсом, что может быть не очень удобным.
Рассмотренный метод мне нравится больше.
Важно понять что это «правильная» фича так же как например то что темные темы для приложений лучше светлых (они выглядят лучше и что более важно меньше влияют на зрение) и признать что прежний подход был ошибочным.
Кто-то понимает это быстрее, кто-то медленее, но это нормально.
Здесь требуется разработка очень точной инерциальной системы позиционирования.
Вот здесь например обсуждение: http://stackoverflow.com/questions/7829097/android-accelerometer-accuracy-inertial-navigation
Насчет скорости реакции — она зависит от частоты опроса датчика, задержки между-процессного взаимодействия и задержки обновления UI. Основной параметр все таки частота опроса датчика — и она задана как SENSOR_DELAY_FASTEST, что должно давать 100 Гц.
Здесь также есть возможности для улучшений путем переноса реализации алгоритма из отдельного приложения в драйвер датчика.
Какая реальная задержка — нужно еще подумать как это можно измерить.
А ведь Sony давно реализовала такой тач скрин (технология Floating Touch).
Хотя для полноты картины смотреть нужно также на сервисы Google:
(наверное ответ достоин награды Necromancer :D )
Он выдает наилучшее качество. Наихудшее качество, которое невозможно слушать, и не понимаю как это можно продавать, выдает Belkin CarAudio Connect AUX with Bluetooth.
Остальные DIY модули заметно шумят.
Среди Windows/MacOS/Linux MacOS для меня стоит на последнем месте так как пользоваться «их» клавиатурой невозможно после стандартной клавиатуры. Хотите поиграть в закрытый клуб — получите (пишу из-под Ubuntu, MacMini валяется сбоку выключенным).
Сейчас комментарий понятно больше не актуальный.
Один из вариантов правильного решения — использовать Handler.
Почему так — ну тут лучше самому почитать больше о многопоточности.
Все остальное нравится. Разве что сделал бы приложение более полноэкранным (заезжающим под статус бар и под навигейшн бар).