lopspower / README.md
All Android Directory Path
1) System directories
⚠️ We can’t write to these folers
Method | Result |
---|---|
Environment.getDataDirectory() | /data |
Environment.getDownloadCacheDirectory() | /cache |
Environment.getRootDirectory() | /system |
2) External storage directories
⚠️ Need WRITE_EXTERNAL_STORAGE Permission
Method | Result |
---|---|
Environment.getExternalStorageDirectory() | /storage/sdcard0 |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS) | /storage/sdcard0/Alarms |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) | /storage/sdcard0/DCIM |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) | /storage/sdcard0/Download |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) | /storage/sdcard0/Movies |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) | /storage/sdcard0/Music |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS) | /storage/sdcard0/Notifications |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) | /storage/sdcard0/Pictures |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS) | /storage/sdcard0/Podcasts |
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES) | /storage/sdcard0/Ringtones |
3) Application directories
Method | Result |
---|---|
getCacheDir() | /data/data/package/cache |
getFilesDir() | /data/data/package/files |
getFilesDir().getParent() | /data/data/package |
4) Application External storage directories
Источник
Find classes in Android project or application path
During the internship in 5th semester of university’s Computer Science program, I had to program an extendable Android application. What I mean by this is that I did not program the application the usual way. There was one main activity that scanned the application for other Activity classes in a package called ‘plugins’.
Each activity had its own resource file, layout file, icon and name. The main activity loaded these activities and added them into the toolbar menu. This way, the only thing to add a new functionality to the application was to create a new plugin activity together with its resource files and an icon, and the application took care of the rest.
In order to do so, I needed to create an algorithm that would scan the project files at the run-time. I had a superclass called Plugin that defined all the Plugin classes. These plugin classes included the plugin’s activity and resources paths. These classes had a name that started with ‘Plugin’, so for example ‘PluginUsers’, and were all located in package called ‘com.xxx.xxx.plugins’. There is an attribute ‘defaultPlugin’ in each plugin which tells us that the plugin is default and should be shown as the activity after MainActivity. There can be more plugins set to default; the scanner algorithm will consider the last default scanned plugin to be really default. Although, there has to be at least one plugin which is set to defaultPlugin = true;
The singleton Plugins only took care of storing of plugins in a collection. The superclass Plugin that each plugin had to extend looks like this:
So let’s see an example. My plugin PluginUsers has all the necessary attributes and it extends the plugin class, that is why it will be loaded as an activity. It’s also specified as default, so unless there are other plugins that are set to default too, this activity will be loaded after the plugin scan is complete. It is really up to you to make sure that all the resources are programmed properly, but if you do, you will have a fully functional plugin that gets inserted into the application. If you’d like to deactivate the plugin, you can simply remove the subset ‘Plugin’ from the name of the plugin, or replace it with other letters or words.
You will probably not come across a requirement to design an application this way. I was asked to find a way to make this work as it was a requirement from my internship company. It is not the best way to program and it does not find many applications in real life, although it is interesting to see that things can be done this way too.
Vladimir Marton
DevOps Engineer focused on cloud infrastructure, automation, CI/CD and programming in Javascript, Python, PHP and SQL. Guidearea is my oldest project where I write articles about programming, marketing, SEO and others.
Источник
Класс Path
Класс android.graphics.Path (контур) позволяет создавать прямые, кривые, узоры и прочие линии. Готовый путь затем можно вывести на экран при помощи метода canvas.drawPath(path, paint).
Рассмотрим базовый пример с применением некоторых методов класса.
Создадим новый класс, наследующий от View:
Подключим его к главной активности, чтобы вывести на экран:
Методы
Метод reset() очищает объект Path.
Метод moveTo() ставит кисть в указанную точку, с которой пойдёт новая линия.
Метод lineTo() рисует линию от текущей точки до указанной, следующее рисование пойдёт уже от указанной точки.
Метод close() закрывает контур.
Методы addRect(), addCircle() добавляю к контуру прямоугольник и окружность. В методах используется параметр, отвечающий за направление. Есть два варианта: Path.Direction.CW (по часовой) и Path.Direction.CCW (против часовой).
Метод cubicTo() рисует кубическую кривую Безье. По аналогии можете изучить другие методы.
Методы moveTo(), lineTo(), quadTo(), cubicTo() имеют методы-двойники, начинающиеся с буквы r (relative): rMoveTo(), rLineTo(), rQuadTo(), rCubicTo(). Данные методы используют не абсолютные, а относительные координаты.
Спроектируем лестницу при помощи метода lineTo().
Проверяем, удобно ли спускаться. Теория — это одно, а практика — это совсем другое.
Эффекты
Контурные эффекты используются для управления отрисовкой контура. Они чрезвычайно полезны для рисования контурных графических примитивов, но могут быть применены к любому объекту Paint, чтобы повлиять на способ отрисовки их очертаний.
Используя этот вид эффектов, вы можете менять внешний вид углов фигур и их очертание.
- CornerPathEffect. Позволяет сглаживать острые углы в форме графического примитива, заменяя их на закругленные.
- DashPathEffect. Вместо рисования сплошного контура можете использовать DashPathEffect для создания очертания, состоящего из ломаных линий (тире/точек). Есть возможность указать любой шаблон повторения сплошных/пустых отрезков.
- DiscretePathEffect. Делает то же самое, что и DashPathEffect, но добавляет элемент случайности. Указываются длина каждого отрезка и степень отклонения от оригинального контура.
- PathDashPathEffect. Позволяет определить новую фигуру (контур), чтобы использовать ее в виде отпечатка оригинального контура.
- SumPathEffect. Добавляет последовательность из двух эффектов, каждый из которых применяется к оригинальному контуру, после чего результаты смешиваются;
- ComposePathEffect. Использует первый эффект, затем к полученному результату добавляет второй.
Контурные эффекты, влияющие на форму объекта, который должен быть нарисован, изменяют и область, занимаемую им. Благодаря этому любые эффекты для закрашивания, применяемые к данной фигуре, отрисовываются в новых границах.
Контурные эффекты применяются к объекту Paint с помощью метода setPathEffect()
DashPathEffect
Сплошную линию можно сделать пунктирной с помощью класса DashPathEffect. Перепишем немного код.
Вам нужно указать длину отрезка для пунктира и длину отрезка для разрыва между двумя отрезками пунктира. Эта комбинация будет циклично использована для прорисовки всей линии. Пунктирная линия может быть сложной. Задайте массив для переменной intervals, чтобы увидеть разницу.
Упрощённый вариант для Kotlin с применением Bitmap в ImageView.
Вместо точек можно вывести пунктирную линию, исправив одну строчку кода.
CornerPathEffect
С помощью CornerPathEffect можно закруглить углы у прямых линий, чтобы ступеньки стали скользкими. Но проходимость коробки увеличится.
PathDashPathEffect
PathDashPathEffect позволяет определить новую фигуру, чтобы использовать её в виде отпечатка оригинального контура.
Бегущие муравьи
Вы все встречали эффект «бегущие муравьи» в графических редакторах. Применим его к объекту класса PathDashPathEffect, увеличивая смещение.
На странице Effect of advance, phase, style in PathDashPathEffect автор примера поиграл с параметрами.
DiscretePathEffect
DiscretePathEffect позволяет «сломать» прямую линию, чтобы получить ломаную с элементом случайности. Полученная ломанная линия будет состоять из отдельных отрезков. Мы можем воздействовать на длину и степень излома.
Показать код (ткните лапой)
SumPathEffect
SumPathEffect добавляет последовательность из двух эффектов, каждый из которых применяется к оригинальному контуру, после чего результаты смешиваются. По сути, два эффекта накладываются друг на друга.
Суммируем эффекты CornerPathEffect и DashPathEffect. Для наглядности я чуть изменил параметры у эффектов, чтобы было виден результат наложения двух эффектов на лестницу — вы должны увидеть две линии — прерывистую и скруглённую.
Показать код (щелкните мышкой)
ComposePathEffect
ComposePathEffect использует первый эффект, затем к полученному результату добавляет второй. Таким образом, мы можем сделать нашу лестницу скруглённой, а затем прерывистой. Порядок эффектов имеет значение, хотя в нашем примере это не принципиально.
Заменим класс SumPathEffect на ComposePathEffect из предыдущего примера и посмотрим на результат.
Пример
В документации есть отдельный пример на эту тему. При запуске примера мы увидим шесть вариантов эффектов, причём четыре из них будут анимированными! Поэтому желательно запустить проект и взглянуть на пример в действии, так как картинка не передаст прелесть эффектов.
Примеры с контурами
Продолжим опыты с контурами. Подготовим новый класс Shape, который будет отвечать за фигуры.
В класс PathView внесём изменения.
Добавим в разметку компонент SeekBar, чтобы динамически менять размер контура.
Запустив проект, вы можете с помощью ползунка менять размеры контура, который в данной реализации является окружностью.
Усложним пример. Будем использовать не только окружность, но и другие фигуры. Добавим в класс Shape метод setPolygon():
Класс PathView потребует небольшой переделки.
В разметке до компонента PathView добавьте пару новых компонентов.
Код для активности.
Теперь мы можем создавать более сложные фигуры — многоугольники, начиная с треугольника, затем четырёхугольник, пятиугольники и так далее.
Следующий этап — создание звёзд, пятиконечной, шестиконечной и т.д.
Опять добавим код в класс Shape.
Внесём изменения в класс PathView.
Чтобы закруглить углы у звёзд, применим эффект CornerPathEffect. Добавим код в конструктор класса Shape.
Чтобы залить фигуру цветом, нужно использовать вместо стиля Paint.Style.STROKE стиль Paint.Style.FILL или Paint.Style.FILL_AND_STROKE.
Вращение
Чтобы вращать контур, нужно создать объект класса Matrix и вызвать метод postRotate().
Добавим в класс PathView две новых переменных.
Добавим строчку кода в метод init():
Добавим код в onDraw():
Добавим новый метод.
Добавим в разметку активности ещё один SeekBar
И добавляем код в класс активности:
Вращать можно не только сам контур, но и холст вместо него. Эффект будет такой же, а по потреблению ресурсов даже может оказаться эффективнее. Закоментируем использование класса Matrix и добавим вызов метода Canvas.rotate() в методе onDraw() класса PathView.
Теперь создадим эффект «бегущих муравьёв» при помощи PathDashPathEffect:
Источник