`
zhiweiofli
  • 浏览: 515133 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【翻译】 Android上实现文字围绕图片的布局

阅读更多

       在这边文章中,我将会介绍如何去实现一个在Android系统中不常见的布局:文字围绕图片布局。

       这个布局并不属于Android模式,但在处理相同的情景下,它是一样的实用。

       在你正式使用它到实践项目前,你需对其进行一定的修改,毕竟它只是一个例子代码

       以下是例子的布局:

 

 <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"></TextView>

            <ImageView
                android:id="@+id/icon"
                android:src="@drawable/rectangle"
                android:layout_width="150dp"
                android:layout_height="150dp"></ImageView>

        </RelativeLayout>

    </ScrollView>

       你可以使用 LeadingMarginSpan.LeadingMarginSpan2 来实现我们的布局。

 

       通过实现LeadingMarginSpan.LeadingMarginSpan2 接口,我们可以指定”围绕段落“的行数以及“段落的第一行”和被围绕对象的边距。

 

class MyLeadingMarginSpan2 implements LeadingMarginSpan.LeadingMarginSpan2 {

        private int margin;
        private int lines;

        MyLeadingMarginSpan2(int lines, int margin) {
            this.margin = margin;
            this.lines = lines;
        }

        /**
         * Apply the margin
         *
         * @param first
         * @return
         */
        @Override
        public int getLeadingMargin(boolean first) {
            if (first) {
                return margin;
            } else {
                return 0;
            }
        }

        @Override
        public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,
                                      int top, int baseline, int bottom, CharSequence text,
                                      int start, int end, boolean first, Layout layout) {}


        @Override
        public int getLeadingMarginLineCount() {
            return lines;
        }
    };

       我们只需要计算文本需要的行数,以及其实际的边距和右边距。

 

       在这里,我们所需的行数=图片的高度,边距=图片的宽度+一点点额外的边距。

 

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.text);
        mImageView = (ImageView) findViewById(R.id.icon);


        final ViewTreeObserver vto = mImageView.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mImageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                finalHeight = mImageView.getMeasuredHeight();
                finalWidth = mImageView.getMeasuredWidth();
                makeSpan();
            }
        });
    }
}

       我的实现简单而原始,用 float textLineHeight = mTextView.getPaint().getTextSize(); 计算文本的行数。读者可以通过添加一些padding,margin 或者你也可以通过类Rect来计算文本的四条边等方式来改善一下代码的效果:

 

 

 /**
     * This method builds the text layout
     */
    private void makeSpan() {

        /**
         * Get the text
         */
        String plainText=getResources().getString(R.string.text_sample);
        

        int allTextStart = 0;
        int allTextEnd = htmlText.length() - 1;

        /**
         * Calculate the lines number = image height.
         * You can improve it... it is just an example
         */
        int lines;
        Rect bounds = new Rect();
        mTextView.getPaint().getTextBounds(plainText.substring(0,10), 0, 1, bounds);

        //float textLineHeight = mTextView.getPaint().getTextSize();
        float fontSpacing=mTextView.getPaint().getFontSpacing();
        lines = (int) (finalHeight/fontSpacing);

        /**
         * Build the layout with LeadingMarginSpan2
         */
        MyLeadingMarginSpan2 span = new MyLeadingMarginSpan2(lines, finalWidth +10 );
        mSpannableString.setSpan(span, allTextStart, allTextEnd,
                   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        mTextView.setText(mSpannableString);
    }

       

 

 

       本文由zhiweiofli编辑发布,转载请注明出处,谢谢。

 

 

 

 

 

 

 

 

  • 大小: 74.1 KB
0
0
分享到:
评论

相关推荐

    Android 图文混排 ,文字围绕图片

    3. LayoutParams与相对布局:在Android中,可以使用RelativeLayout来控制元素的相对位置,通过设置LayoutParams,调整TextView和ImageView的布局属性,实现图片在文字中的精确定位。 二、非HTML实现图文混排 1. ...

    Android-最简单的状态切换布局

    "Android-最简单的状态切换布局"这一主题就是围绕如何构建这样一个灵活且易用的组件展开的。 首先,状态切换布局的核心思想是将不同状态的界面视图封装成单独的布局文件,然后在运行时根据应用程序的状态动态地切换...

    图片添加文字

    "图片上添加文字,文字可拖动"的功能是通过编程技术实现的,这通常涉及到图像处理和用户界面交互的设计。本知识点主要围绕如何使用ViewBadge进行改进来实现这一功能。 首先,ViewBadge是一个Android UI组件,常用于...

    Android-CircleTextView(圆形文字View)

    `CircleTextView`就是这样一个特殊的视图,它将普通的TextView包裹在一个圆形的布局中,使得文字围绕圆形边缘显示。这种效果常用于制作数字时钟、进度指示器或者一些具有创意的用户界面元素。 ### 一、...

    android 圆形旋转按钮实现

    - 菜单项的样式可以根据需求自定义,可以是图片、文字或者两者结合。 - 考虑到可用性和易用性,确保每个选项在旋转过程中都能清晰可见。 - 为了提供更好的视觉反馈,被选中的项可以有特殊的高亮效果。 5. **性能...

    Android旋转菜单实现示例

    本篇文章将详细讲解如何在Android平台上实现一个旋转菜单的效果,这个示例被誉为“史上最简单的Android旋转菜单”。 首先,我们要了解旋转菜单的基本概念。旋转菜单通常是指一种以中心点为轴,通过动画效果展开或...

    Android TextView 45度倾斜旋转效果

    这段代码中,TextView将围绕其几何中心旋转45度,但其边框仍保持矩形形状,文字也会居中显示。 除了XML布局外,我们还可以在代码中动态改变TextView的旋转角度。使用`View.setRotation()`方法,传入一个浮点数表示...

    android opengl es 绘画文字和3d动画

    在Android平台上,OpenGL ES是一种广泛使用的图形库,用于在移动设备上实现高性能的2D和3D图形渲染。OpenGL ES(Embedded Systems版本)是OpenGL的一个轻量级分支,专为嵌入式系统如智能手机和平板电脑设计。在这个...

    android圆盘旋转效果

    总之,"android圆盘旋转效果"是一个值得深入研究的Android控件实现,它涉及到了Android图形绘制、动画实现以及自定义View等多个核心知识点。通过学习和实践,你不仅可以掌握这一特定的UI组件,还能提升你的Android...

    Android圆形旋转菜单

    在代码实现上,开发者首先需要创建一个自定义的View类,继承自Android的基础View或者 ViewGroup。这个自定义类将包含菜单项的布局和动画逻辑。布局可以使用LinearLayout、RelativeLayout或者自定义的布局管理器,...

    Android仿微信、支付宝钱包宫格界面Demo

    本篇内容将深入讲解如何实现这样一个宫格界面,主要围绕以下几个关键知识点: 1. **GridView布局**: GridView是Android中的一个控件,它可以将子视图以网格的形式排列。在宫格界面中,GridView是最基础的元素,...

    精选_基于Android智能手机的文字识别报纸阅读器_源码打包

    6. **文件名称列表**:"text-recognition-app"可能是项目的主模块或应用的名称,这表明源代码可能围绕这个核心模块组织,包含与文字识别相关的所有类和资源文件,如布局XML文件、图片资源、字体文件等。 7. **应用...

    Android应用源码——仿美图秀秀和IOS系统的相机胶卷.zip

    在Android平台上实现类似的功能,需要涉及以下几个关键知识点: 1. **图片加载库**:如 Glide 或 Picasso,用于高效地加载和显示图片,同时支持图片的缓存和内存管理,以避免内存泄漏。 2. **图片处理**:可能包含...

    自定义下拉框(android)

    在这个方法中,我们可以根据需要加载XML布局,并设置文本、图片等元素。 3. **Spinner样式**: 为了达到WEB风格,我们需要调整Spinner的默认样式。这可以通过在`res/values/styles.xml`文件中创建一个新的样式,...

    Android中自定义加载样式图片的具体实现

    `animated-rotate`标签用于实现旋转动画,`android:drawable`属性引用了之前定义的旋转图片,`android:pivotX`和`android:pivotY`设置为`50%`,意味着图片将围绕其中心点进行旋转。 至此,我们已经完成了大部分工作...

    第02章 Android简单控件的开发及应用

    本章主要围绕Android中的常见UI控件展开,包括它们的功能、用法以及如何在实际项目中进行有效的布局设计。我们将深入探讨以下几个关键知识点: 1. **TextView**:TextView是最基本的文字展示控件,用于显示单行或...

    仿iPhone的android圆环旋转按钮菜单

    综上所述,"仿iPhone的Android圆环旋转按钮菜单"涉及了Android开发的多个核心领域,包括自定义View的绘制、动画实现、事件处理以及UI设计等。开发者在实现这个特效时,不仅可以提升技术能力,还能锻炼解决问题和创新...

    Android窗体自定义标题栏

    本文将围绕“Android窗体自定义标题栏”这一主题,深入探讨如何根据需求创建个性化标题栏,并结合标签“源码”和“工具”来分享相关的实践技巧。 首先,我们来看标题栏的基础结构。一个自定义标题栏通常包括以下几...

    Android一个引导页的显示

    在Android中,我们可以使用ViewPager组件来实现页面的滑动切换,结合ImageView显示图片,TextView展示文字。 1. **使用ViewPager** ViewPager是Android支持库中的一个组件,用于实现左右滑动查看多个页面的效果。...

    Google Android开发范例

    以上就是关于“Google Android开发范例”的一些核心知识点,包括更改文字标签、设置窗口底色、调整TextView文字颜色以及实现类似iPhone的图片滑动效果。掌握这些技术,将有助于你开发出更加美观和交互性强的Android...

Global site tag (gtag.js) - Google Analytics