Как стать автором
Обновить
26
0
Янчишин Руслан @r_ii

Разработчик

Отправить сообщение
Обладаю такой камерой. Для путешествий использую вместе с объективом SONY SEL28F20 Выходит очень легкая и компактная система.
Также эта тушка очень интересна наличием неплохих систем подсказок для ручной фокусировки и возможностью нацепить через переходник практически любой старый мануальный объектив. Например такой:
О — даже один минус есть. Т.е. кто-то предпочел-бы чтоб этого комментария здесь не было.
Хорошо если этот кто-то хоть что-то сделал для развития общества.
Там есть некоторые ошибки, но я думаю не составит труда их исправить тому кто надумает использовать :)
Я попробовал развить идею и вот что вышло:
Класс CleanAdapter
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
	}
}


Еще один очевидный метод (и правильный с точки зрения ООП) это дать возможность элементу «обработать» себя самому.
Но это потребует расширения всех классов данных определенным интерфейсом, что может быть не очень удобным.
Рассмотренный метод мне нравится больше.
Я бы еще вспомнил наушники Sony h.ear on MDR-100AAP
Хорошая новость. Использую закладки сбоку еще со времен Оперы и не понимаю как может быть по другому особенно на широкоформатных мониторах.
Важно понять что это «правильная» фича так же как например то что темные темы для приложений лучше светлых (они выглядят лучше и что более важно меньше влияют на зрение) и признать что прежний подход был ошибочным.
Кто-то понимает это быстрее, кто-то медленее, но это нормально.
Вы правы в том, что изображение все таки не стоит на месте. В этом плане алгоритм требует доработки.
Здесь требуется разработка очень точной инерциальной системы позиционирования.
Вот здесь например обсуждение: http://stackoverflow.com/questions/7829097/android-accelerometer-accuracy-inertial-navigation

Насчет скорости реакции — она зависит от частоты опроса датчика, задержки между-процессного взаимодействия и задержки обновления UI. Основной параметр все таки частота опроса датчика — и она задана как SENSOR_DELAY_FASTEST, что должно давать 100 Гц.
Здесь также есть возможности для улучшений путем переноса реализации алгоритма из отдельного приложения в драйвер датчика.

Какая реальная задержка — нужно еще подумать как это можно измерить.
Ощутимой разницы я не заметил.
Интерфейс был бы намного более отзывчивый если б Андроид поддерживал hover жесты. Тогда понять нажимается ли элемент можно было бы просто приблизив палец.
А ведь Sony давно реализовала такой тач скрин (технология Floating Touch).
"Любая проблема проектирования может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев" в действии.
Нету ничего удивительного в том, что Facebook ест много ресурсов. Посмотрите сколько там сервисов:
image
Хотя для полноты картины смотреть нужно также на сервисы Google:
Избежать ошибки «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 валяется сбоку выключенным).
На картинке неплохая команда. Но что насчет этой команды?
image
Подозреваю на момент публикации комментария не все в порядке было с хабракатом.
Сейчас комментарий понятно больше не актуальный.
Я так понимаю задача MyTask — отложенное выполнение кода (изменение громкости). Если так, то это ужасное решение и антипаттерн.
Один из вариантов правильного решения — использовать Handler.
Почему так — ну тут лучше самому почитать больше о многопоточности.
Отличный пример того как можно испоганить иконку. Теперь она не передает оригинальной идеи так как объектив теперь не узнается. К тому же тень меняет Z порядок.
Все остальное нравится. Разве что сделал бы приложение более полноэкранным (заезжающим под статус бар и под навигейшн бар).
Так это делается проще — нужно просто закрыть приложение кнопкой Back.

Информация

В рейтинге
Не участвует
Откуда
Украина
Дата рождения
Зарегистрирован
Активность