-
Notifications
You must be signed in to change notification settings - Fork 13
Font Engine Explanation
The MTextView class is an advanced custom view for rendering text with support for Persian and Arabic fonts, along with extensive styling options such as gradients, shadows, and texture fills. This document aims to provide a deep technical understanding of its implementation for Android developers.
MTextView
extends View
and is designed to provide a highly customizable text view with features not available in the standard Android TextView
. It supports complex rendering scenarios, including text effects and custom font rendering, particularly focusing on languages with complex glyphs like Persian and Arabic.
The constructor overloads and the init()
method set up the initial state, including paint objects for different text effects and default properties. Typeface, text size, colors, and other properties are configurable and set during initialization.
-
Text Rendering: Custom font rendering is achieved through
Typeface
objects, which are applied toPaint
instances used for drawing text. -
Effects and Styles: Supports shadows (
TextShadow
), gradients (TextGradient
), strokes (TextStroke
), underlines, strike-throughs, and background colors. Each effect is managed by separatePaint
objects and boolean flags to toggle their application. - Layout and Interaction: Implements custom touch handling for position adjustments and focuses changes, which are essential for interactive text editing within a design app.
-
Performance Optimization: Utilizes flags like
NeedLayout
and methods likefreeze()
andunfreeze()
to manage layout requests efficiently, minimizing unnecessary redraws.
The draw(Canvas canvas)
method orchestrates the rendering process. It handles:
- Background drawing based on
TextBGColor
andTextBGColorHave
. - Text drawing with support for multiline texts, applying effects sequentially: shadows, strokes, gradients, and textures.
- Dynamic adjustment of text positioning based on
mGravity
to support alignment.
-
Shadows: Applied using
setShadowLayer
on the textPaint
object. -
Gradients: Uses
LinearGradient
shaders with configurable colors, angle (TextGradientRotate
), and tile mode. Applied totextPaint_Gradient
. -
Textures: Achieved by applying a
BitmapShader
totextPaint_Texture
, allowing bitmap fills. -
Strokes: Rendered by setting
Style.STROKE
ontextPaint_Stroke
and adjustingstrokeWidth
.
Handles touch events to enable drag-and-drop positioning within a parent layout, with custom touch logic in onTouch(View view, MotionEvent event)
to update layout parameters based on touch movements.
Overrides onMeasure(int widthMeasureSpec, int heightMeasureSpec)
to calculate the size based on text content and applied effects. Uses custom methods like getrectSize(Paint paint, String text, float LineSpacing)
to compute text dimensions accurately.
Developers can extend MTextView
to add new features or modify existing behaviors. The class is designed with extension in mind, separating concerns like paint setup, touch handling, and drawing into distinct methods.
MTextView
is a comprehensive solution for rendering richly styled text in Android applications, especially suitable for apps requiring detailed control over text appearance and interactive editing. Its design emphasizes flexibility, performance, and support for complex scripts, making it a valuable component for developers working on graphic design apps or any application where enhanced text rendering is needed.
The Shadow
class is part of an Android application that allows users to apply shadow effects to text. It extends BaseFragment
, indicating it's used within a fragment-based architecture, commonly found in Android apps to provide a modular and dynamic user interface.
This fragment provides a user interface for adjusting shadow properties of text, such as shadow X and Y offsets, shadow density (blur), and shadow color. It utilizes SeekBar
elements for input on shadow adjustments and a custom TextIcon
as a toggle for enabling or disabling the shadow effect.
-
Layout and Initialization: The fragment's layout is defined in
f_shadow.xml
, which includes UI elements for adjusting shadow properties. Upon inflating the layout inonCreateView
, it initializes these elements and sets up listeners for user interactions. -
User Interaction Handling:
-
ShadowButtonListener
andSeekBarChangeListener
are inner classes that handle button clicks and seek bar changes, respectively. These listeners update the shadow properties of the selected text view (MainActivity.mainInstance().SelecetedTextView
) in real-time based on user input. - The
eyeShadow
TextIcon
acts as a toggle for enabling or disabling the text shadow. When its state changes, it updates the shadow properties of the currently selected text view.
-
-
Dynamic UI Updates: As the user interacts with the seek bars (
seekshadowx
,seekshadowy
,seekshadowdensity
), the corresponding text view's shadow properties are updated. This dynamic feedback allows users to visually gauge the effect of their adjustments immediately. -
Fragment Lifecycle Management: In
onDestroyView
, the method nullifies references to UI elements and listeners to prevent memory leaks. This step is crucial for avoiding potential issues related to fragment lifecycles
and the management of resources within an Android application.
-
Instantiation and Arguments: The
newInstance
method suggests a static factory pattern for creating instances of theShadow
fragment, potentially allowing arguments to be set via aBundle
for customized initialization, though in the current implementation, the bundle is unused. -
Layout Inflation: In
onCreateView
, the fragment inflates its layout fromR.layout.f_shadow
, establishing the UI for shadow effect adjustments. This method also sets up the interaction logic for the UI elements, binding actions to the shadow effect controls. -
Shadow Effect Controls:
-
Toggle Shadow: The
eyeShadow
TextIcon
toggles the shadow effect on or off. Its listener updates the shadow properties of the selected text based on its checked state. -
Adjust Shadow X and Y Offset, Density:
SeekBar
elements for X and Y offsets and density are hooked up with aSeekBarChangeListener
, which adjusts the corresponding shadow properties of the text in response to user input.
-
Toggle Shadow: The
-
Shadow Color Customization: The
shadowmagiccolor
TextIcon
likely triggers a color picker dialog or another interface element for selecting a shadow color, though the actual implementation of this action isn't detailed in the provided code snippet.
Developers looking to extend or integrate the Shadow
fragment into their applications should consider the following:
-
Customization and Flexibility: Additional parameters and settings can be passed to the fragment at instantiation via the
Bundle
innewInstance
. This approach allows for more flexible use of theShadow
fragment across different parts of an application. - UI and UX Enhancements: The user experience for selecting shadow colors and adjusting properties can be further refined. For instance, integrating a more intuitive color picker or providing real-time previews of shadow adjustments could enhance usability.
- Performance Optimizations: When updating text shadow properties in real-time, it's important to ensure that performance remains smooth. Developers should monitor the impact of these updates on UI responsiveness and make optimizations as necessary.
The Shadow
fragment is part of a larger text editing feature set within the application. Its design and implementation are closely linked with the MainActivity
and specific views like MTextView
, indicating a tightly coupled architecture. Developers working with the Shadow
class should be familiar with the overall structure of the text editing functionalities in the application to ensure seamless integration and consistent user experience.
The TextBg
class in the fragments.textEffects
package is an Android fragment used for configuring background properties of text in an application. This fragment provides a user interface for adjusting the background color, padding (X and Y), overall padding, and corner radius for text elements.
-
UI Elements: The fragment includes several UI elements such as
SeekBar
for adjusting padding and corner radius,TextIcon
for actions like setting the background color, andTextView
for displaying current values of adjustments. -
Listeners for User Interactions: It implements
SeekBarChangeListener
for handling changes in seek bars andShadowButtonListener
for handling clicks on icons. These listeners update the properties of the text element being edited in real time. -
Fragment Lifecycle Management: The
onDestroyView
method ensures that references to UI elements and listeners are cleared when the view is destroyed to prevent memory leaks.
-
Fragment Initialization: Similar to other fragments in the application,
TextBg
can be instantiated using thenewInstance
method, although it seems to have a mistake by returning an instance ofShadow
instead. This should typically return an instance ofTextBg
. -
View Creation: In the
onCreateView
method, the fragment inflates its layout fromf_textboxsize.xml
, which contains the UI for text background configuration. -
View Setup: The
onViewCreated
method initializes the UI elements and sets up listeners. This includes setting up seek bars for adjusting the X and Y padding, overall padding, and corner radius. Additionally, it configures theeyeTextBox
TextIcon
as a toggle for enabling or disabling the text background configuration. -
Dynamic UI Updates: As the user interacts with the UI elements, the corresponding properties of the selected text view (
MainActivity.mainInstance().SelecetedTextView
) are updated. This includes applying background color changes, padding adjustments, and corner radius settings. -
Color Customization: The
textBgColor
TextIcon
likely triggers a color picker dialog for selecting a background color. The actual implementation of this functionality isn't detailed in the provided code snippet but is suggested by the setup of a listener that would handle color selection.
Developers extending or integrating the TextBg
fragment should ensure consistency and usability in the text editing experience:
- Error Handling and Validation: Implement validation for the input values to ensure they are within acceptable ranges. This prevents the application from applying incorrect settings that could negatively affect the layout or appearance of the text.
- User Experience Enhancements: Consider providing real-time previews of background adjustments to give users a better understanding of how their changes will look.
-
Integration with Text Editing Features: Ensure that
TextBg
works seamlessly with other text editing features in the application, such as font adjustments and text effects, to provide a comprehensive text editing toolset.
By carefully managing the fragment's lifecycle and ensuring a smooth and intuitive user interface, TextBg
can significantly enhance the text editing capabilities of an Android application, allowing users to customize the appearance of text elements with precision and ease.
The Alignment
class within the fragments.textEffects
package is a fragment designed for adjusting the text alignment within an Android application. This fragment offers users the ability to align their text to the left, right, or center, enhancing the text customization capabilities of the application.
- Fragment Role: Provides UI elements for users to select text alignment options.
-
Inflation: Inflates its view from
f_text_align.xml
, which contains the layout for alignment options. - User Interaction: Listens for click events on alignment option buttons and applies the selected alignment to the active text view.
-
TextIcon Buttons: Utilizes
TextIcon
views (btntextleft
,btntextright
,btntextcenter
) as buttons for selecting text alignment. These buttons are part of the layout inflated fromf_text_align.xml
. -
AlignmentButtonListener: An internal class that implements
View.OnClickListener
to handle click events on the alignment buttons. Depending on which button is clicked, it adjusts the text alignment of the currently selected text view inMainActivity
.
-
onCreateView: Sets up the fragment view by inflating the layout and initializing the alignment buttons with an
AlignmentButtonListener
. -
AlignmentButtonListener.onClick: Determines which button was clicked and sets the gravity (alignment) of the currently selected text view (
MainActivity.mainInstance().SelecetedTextView
) accordingly. The alignment options are:-
Left Alignment: Sets the gravity to
Gravity.START
. -
Right Alignment: Sets the gravity to
Gravity.END
. -
Center Alignment: Sets the gravity to
Gravity.CENTER
.
-
Left Alignment: Sets the gravity to
-
Global Text View Reference: Relies on
MainActivity.mainInstance().SelecetedTextView
to determine which text view's alignment is to be adjusted. This design implies that the application maintains a global reference to the currently active or selected text view. -
Text View Map: Updates the alignment property in
MainActivity.mainInstance().TextViewMap
, ensuring that the alignment setting is recorded and can be persisted or reused as needed.
The Alignment
fragment is particularly useful in text editing applications or features within an app where users need to adjust the layout of their text. By providing a straightforward interface for text alignment, it enhances the user's ability to format their content effectively.
When extending or integrating this fragment, developers should ensure that:
- The fragment's UI is accessible and intuitive, providing clear indications of the current alignment setting.
- Changes to text alignment are reflected immediately, offering real-time feedback to the user.
- The fragment gracefully handles cases where no text view is currently selected or available for alignment adjustment.
This fragment exemplifies how to implement a specific text formatting feature within an Android application, providing a template for similar features that might adjust other text properties such as font size, color, or style.
The Alignment
fragment in the fragments.textEffects
package is designed to offer users the ability to adjust the alignment of text within an Android application, specifically within the context of MainActivity
. This fragment provides a user interface with three options for text alignment: left, right, and center, managed through TextIcon
views.
- Purpose: To allow users to change the alignment of text to left, right, or center within the application.
-
Implementation: The fragment inflates its view from
f_text_align.xml
, which contains threeTextIcon
views (btntextleft
,btntextright
,btntextcenter
) representing the alignment options. -
User Interaction: Users interact with the alignment options through clicks. The
AlignmentButtonListener
class listens for these click events and adjusts the alignment of the currently selected text view accordingly.
- TextIcon Views: Serve as clickable buttons for each alignment option. When a user selects one of these options, the text alignment of the currently active text view is updated.
-
AlignmentButtonListener: A private static class that implements
View.OnClickListener
. It responds to clicks on the alignment buttons, setting the gravity of the currently selected text view inMainActivity
to the chosen alignment.
-
onCreateView: This method inflates the layout containing the alignment options and sets up the
AlignmentButtonListener
for eachTextIcon
button. -
AlignmentButtonListener.onClick: Determines which alignment option was selected based on the ID of the clicked view. It then sets the gravity of the currently selected text view (
MainActivity.mainInstance().SelecetedTextView
) to reflect the chosen alignment:-
btntextleft
: Sets text alignment to left (Gravity.START
). -
btntextright
: Sets text alignment to right (Gravity.END
). -
btntextcenter
: Sets text alignment to center (Gravity.CENTER
).
-
- The fragment relies on a reference to the currently selected text view (
MainActivity.mainInstance().SelecetedTextView
) to apply the alignment settings. This approach ensures that the alignment changes are applied directly to the text view that the user intends to modify. - It updates the alignment setting in a shared map (
MainActivity.mainInstance().TextViewMap
) keyed by text view IDs (MainActivity.mainInstance().textArrayID
). This map tracks the properties of text views within the application, allowing for consistent application of text properties across different fragments or activities.
This fragment is especially useful in text editing features of an app, where users need to format text according to their preferences. Developers incorporating this fragment should ensure that the MainActivity
properly maintains the reference to the currently selected text view and that the text view map is accurately updated to reflect changes in text properties.
- Ensure that the
TextIcon
views are easily identifiable and accessible to users to provide a seamless text alignment experience. - Consider extending the functionality to include additional text formatting options, creating a comprehensive text editing interface within the application.
- Test the alignment feature across different Android devices and screen sizes to ensure consistent behavior and appearance.
The Texture_Loader
class in the fragments.textEffects
package is a BaseFragment
designed for selecting and applying texture backgrounds to text within the MainActivity
of an Android application. This fragment provides a user-friendly interface for browsing through available texture files and applying a selected texture to the active text view.
-
Functionality: Enables users to browse and select texture images for text backgrounds. It uses a
RecyclerView
to display available textures stored in a specified directory. -
User Interaction: Users can select a texture by tapping on an item in the
RecyclerView
. The selected texture's path is then applied to the currently selected text view inMainActivity
. -
Adaptation: Utilizes a
RecyclerImageAdapter
to manage the presentation of texture files and handle user selections.
-
SwitchButton
gradient_Switch
: A switch that toggles the texture application feature on or off for the selected text view. -
RecyclerView
recyclerView
: Displays the available textures in a grid layout. It is populated using aRecyclerImageAdapter
. -
List
Texture
: Holds the texture files retrieved from the specified directory. -
RecyclerImageAdapter
mAdapter
: Manages the display and interaction of texture items within theRecyclerView
.
-
onCreateView: Inflates the fragment layout, initializes UI components (e.g.,
RecyclerView
,SwitchButton
), and sets up event listeners. -
onActivityCreated: Loads texture files from a specified directory into the
Texture
list, sets up theRecyclerView
with theGridLayoutManager
andRecyclerImageAdapter
, and populates the adapter with the texture files. -
onItemClick: Handles click events on texture items. When a texture is selected, it updates the path of the texture file in
TextProperties
and applies it to the currently selected text view.
- The fragment interacts with
MainActivity
to apply textures to the currently selected text view (MainActivity.mainInstance().SelecetedTextView
). - The
gradient_Switch
toggles whether the texture feature is active for the selected text view.
- The texture files are expected to be stored in a directory specified by the
ApplicationLoader.appInstance().getString(R.string.ronevisPathTexture)
resource string. - The
listFilesMatching
method filters files in the specified directory using a regular expression, allowing for flexible management of texture files. - Error handling and reporting (e.g., using
FirebaseCrash.report(ignored);
) is implemented to address potential issues during runtime.
- This fragment is particularly useful in applications requiring text customization options, such as text editors or design tools.
- Developers should ensure that the directory containing texture files is properly managed and accessible by the application.
- Testing with various file sizes and formats is recommended to ensure optimal performance and compatibility across different devices.
- Enhancing the user interface with previews of textures or incorporating advanced filtering options could improve user experience.
- Integrating cloud storage or online resources for additional textures could expand the variety and accessibility of textures available to users.