ikocijan / magicviews Goto Github PK
View Code? Open in Web Editor NEWSet custom font in Android application
License: Apache License 2.0
Set custom font in Android application
License: Apache License 2.0
When using as gradle dependency in AS 0.9.2 error is shown when compiling:
Typeface already defined - I don't have any custom attribute named typeface in the project - possible that it clashes with v7 or v4 compat lib?
As per this blog post:
http://android-developers.blogspot.com/2015/04/android-support-library-221.html
There are new views which backport some cool stuff to pre-lollipop devices:
We should extend these for a future MagicViews release.
When style is set to textAppearance attribute the MagicEditText does not use the style to color text. Similar behavior is noted for EditText here: Prototik/HoloEverywhere#730
The library starts by finding every font in the assets folder. When there's a lot of file in the folder, this leads to unacceptable lag. It simply can't be used in some cases. There should be a way to disable finding every font in the assets folder and using a path to the font instead.
Hi Ivan, it would be cool to add a feature to change space between characters, something similiar to this"
public class SpacingTextView extends MagicTextView {
private static final float NO_SPACING = 0.0f;
private float letterSpacing = NO_SPACING;
public SpacingTextView(Context context) {
super(context);
init();
}
public SpacingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
getAttributes(attrs);
init();
}
private void getAttributes(AttributeSet attrs) {
if (attrs != null) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.SpacingTextView, 0, 0);
letterSpacing = a.getFloat(R.styleable.SpacingTextView_tv_spacing, 0);
a.recycle();
}
}
private void init() {
final float THRESHOLD = 0.001f;
if (Math.abs(letterSpacing - NO_SPACING) > THRESHOLD) {
String originalText = getText().toString();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < originalText.length(); i++) {
String c = "" + originalText.charAt(i);
builder.append(c.toLowerCase());
if (i + 1 < originalText.length()) {
builder.append("\u00A0");
}
}
SpannableString finalText = new SpannableString(builder.toString();
if (builder.toString().length() > 1) {
for (int i = 1; i < builder.toString().length(); i += 2) {
finalText.setSpan(new ScaleXSpan(letterSpacing), i, i + 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
}
setText(finalText, TextView.BufferType.SPANNABLE);
}
}
}
fontStyle
should be accessible by either a getter or by being protected
.
I am extending MagicEditText
to override the setError
method so I can use the custom type face on that one also. However the font to use is in fontStyle
.
I tried using FontUtils.getPrefFontStyle(context, attrs, PreferenceType.EDIT_TEXT_PREFERENCE);
in the constructor, but for a reason I don't know after calling the super constructor, this method always returns null
. I guess attrs
gets modified along the way...
The MagicFont utility class now contains a static reference to the context.
This should be avoided as it can prevent the garbage collection of heavyweight objects, like activities or services.
MagicTextView cannot be shown in the IDE because of the following exception:
java.lang.UnsupportedClassVersionError: com/ivankocijan/magicviews/views/MagicTextView : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.lang.ClassLoader.defineClass(ClassLoader.java:471)
at com.intellij.util.lang.UrlClassLoader._defineClass(UrlClassLoader.java:189)
at com.intellij.util.lang.UrlClassLoader.defineClass(UrlClassLoader.java:185)
at com.intellij.util.lang.UrlClassLoader.findClass(UrlClassLoader.java:146)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at com.android.tools.idea.rendering.RenderClassLoader.loadClassFromJar(RenderClassLoader.java:76)
at org.jetbrains.android.uipreview.ProjectClassLoader.loadClassFromModuleOrDependency(ProjectClassLoader.java:106)
at org.jetbrains.android.uipreview.ProjectClassLoader.load(ProjectClassLoader.java:87)
at com.android.tools.idea.rendering.RenderClassLoader.findClass(RenderClassLoader.java:54)
at org.jetbrains.android.uipreview.ProjectClassLoader.findClass(ProjectClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:174)
at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:97)
at com.android.tools.idea.rendering.LayoutlibCallback.loadView(LayoutlibCallback.java:172)
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207)
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:135)
at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
at android.view.LayoutInflater.inflate(LayoutInflater.java:373)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:399)
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:336)
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:332)
at com.android.tools.idea.rendering.RenderService$3.compute(RenderService.java:558)
at com.android.tools.idea.rendering.RenderService$3.compute(RenderService.java:547)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:932)
at com.android.tools.idea.rendering.RenderService.createRenderSession(RenderService.java:547)
at com.android.tools.idea.rendering.RenderService.render(RenderService.java:674)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:586)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1900(AndroidLayoutPreviewToolWindowManager.java:80)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$6$1.run(AndroidLayoutPreviewToolWindowManager.java:528)
at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178)
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$6.run(AndroidLayoutPreviewToolWindowManager.java:523)
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320)
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310)
at com.intellij.util.ui.update.MergingUpdateQueue$2.run(MergingUpdateQueue.java:254)
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269)
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227)
at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217)
at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
at com.intellij.util.Alarm$Request$1.run(Alarm.java:327)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
I want to add a way to set a default font for the views, does that sound ok to you?
While introducing the last PR ( #29 ), I've noticed that some classes keep a reference to the Context. This may be an undesirable since it only might be useful for initialisation.
I propose that the part that initialises typefaces is moved to MagicViews class and that MagicFonts remains the point where typefaces live and keep their references without any Context reference.
I'm willing to do this work, but would need to discuss every change as this may be a major release (if we choose to remove deprecated methods). Would you like future PRs to go to development branch or a new branch just for this?
Hello Ivan, it would be great to have MagicTabLayout so we can change fonts :)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.