精华内容
下载资源
问答
  • Dreamweaver怎么给网站添加一个动态横幅效果?Dreamweaver中想要设计一个动态横幅,该怎么设计呢?下面我们就来看看详细的教程,需要的朋友可以参考下
  • 动画横幅 项目设置 yarn install 编译和热重装以进行开发 yarn serve 编译并最小化生产 yarn build 自定义配置 请参阅。
  • js+css3顶部横幅提示特效是一款点击按钮显示错误信息 成功信息 内容信息等,顶部弹出横幅文字内容提示动画特效。
  • 横幅广告(Banner): 1.横幅广告是网络广告的常见形式,一般位于网页的醒目位置上;当用户单击这些横幅...一般而言,与静态横幅广告相比,动态横幅广告更醒目,更能吸引观众的注意力; 4.当然这还是在恰当适合的...

    横幅广告(Banner):

    1.横幅广告是网络广告的常见形式,一般位于网页的醒目位置上;当用户单击这些横幅广告时,通常可以链接到相应的广告页面;

    2.设计横幅广告时,要力求简单明了,能够体现出主要的中心主旨,鲜明、形象地表达出最主要的广告意图;

    3.横幅广告可以使静态图像,也可以是动态图像。一般而言,与静态横幅广告相比,动态横幅广告更醒目,更能吸引观众的注意力;

    4.当然这还是在恰当适合的前提下(讨厌那种弹窗式和悬浮式的广告)使用不当会造成意想不到的后果,甚至因此观看者的反感造成恶性循环,从而对广告原本的作用大打折扣;

    5.设计横幅广告时,究竟是采取静态形式还是动态形式,取决于哪种形式能够把要表达的信息准确、快速地传递给观看者。

    设计过程:

    (一)编写HTML5代码

    1.输入单击Banner时要链接的网站

     

    <a class="banner" href="http://yamoo9.com">

     

    2.向Banner中添加图片和文字使用class属性标识元素

     

        <a class="banner" href="http://yamoo9.com">
            <img class="banner-logo" src="images/banner-logo.png" alt="yamoo9.com" width="167" height="134" />
            <p class="banner-desc">开放知识讲座, 视频Cast!<br /> 分享设计心得的乐园!<br />
            <strong>- Yamoo9</strong></p>
        </a>

     

    (二)编写CSS3样式表

     

    1.控制body样式

     

    body {
        padding: 20px;
        background: #333;
    }

     

    2.控制Banner样式

     

    a.banner {
        display: block;
        width: 728px;
        height: 176px;
        border: 1px solid #555;
    }

     

    3.设置横幅广告的Logo标志

     

    .modern .banner-logo {
        position: absolute;
        top: 20px;
        left: 270px;
    }

     

    4.向Banner上的文字应用字体

     

    .modern .banner-desc {
        font: 32px/1.1 "NanumPenWeb", "方正静蕾简体", "Nanum Pen Script";
    }

     

    同时还需要在HTML5代码中添加Web字体服务

    <title>CSS3 Banner Design - 动画Banner设计</title>
    <link href='http://api.mobilis.co.kr/webfonts/css/?fontface=NanumPenWeb' rel='stylesheet' />

    5.设置Banner字体的位置与颜色

     

    .modern .banner-desc {
        opacity: 0;
        position: absolute;
        top: 39px;
        left: 170px;
        font: 39px/1.1 "NanumPenWeb", "方正静蕾简体", "Nanum Pen Script";
        color: #4ec1cd;
    }

     

    .modern .banner-desc strong {
        font-size: 23px;
    } 

    6.设置鼠标指针未移动到Banner上的Banner

    a.banner {
        position: relative;
        background: 
            url(../images/banner-arrow.png) no-repeat -100px 140px, 
            url(../images/banner-photo.png) no-repeat -40px 220px, 
            url(../images/banner-09.png) no-repeat -20px -380px,
            url(../images/banner-bg.png) no-repeat 0 0;
    
    }
    .modern a.banner:hover, a.banner:focus {
        background-position: 
            20px 140px, 
            -40px 20px, 
            -20px -90px,
            0 0;    
    }

     

    使用transition函数完成一系列的图片移动操作

    a.banner {
        position: relative;
        background: 
            url(../images/banner-arrow.png) no-repeat -100px 140px, 
            url(../images/banner-photo.png) no-repeat -40px 220px, 
            url(../images/banner-09.png) no-repeat -20px -380px,
            url(../images/banner-bg.png) no-repeat 0 0;
    
        -webkit-transition: all .2s ease-in .2s;
        -moz-transition: all .2s ease-in .2s;
        -o-transition: all .2s ease-in .2s;
        -ms-transition: all .2s ease-in .2s;
        transition: all .2s ease-in .2s;
    }
    .modern a.banner:hover, a.banner:focus {
        background-position: 
            20px 140px, 
            -40px 20px, 
            -20px -90px,
            0 0;    
    }
    .modern .banner-logo {
        position: absolute;
        top: 20px;
        left: 270px;
        -webkit-transition: all .4s ease-out .3s;
        -moz-transition: all .4s ease-out .3s;
        -o-transition: all .4s ease-out .3s;
        -ms-transition: all .4s ease-out .3s;
        transition: all .4s ease-out .3s;
    }
    .modern a.banner:hover .banner-logo, 
    .modern a.banner:focus .banner-logo {
            left: 540px;        
    }
    .modern .banner-desc {
        opacity: 0;
        position: absolute;
        top: 39px;
        left: 170px;
        font: 39px/1.1 "NanumPenWeb", "方正静蕾简体", "Nanum Pen Script";
        color: #4ec1cd;
        -webkit-transition: all .4s ease-out .3s;
        -moz-transition: all .4s ease-out .3s;
        -o-transition: all .4s ease-out .3s;
        -ms-transition: all .4s ease-out .3s;
        transition: all .4s ease-out .3s;
    }

    最后使用JQuery播放声音文件

     

    /* banner.js - Banner设计脚本, 2012 © yamoo9.com    
    ---------------------------------------------------------------- */
    ;(function($){
        $(function() { // $(document).ready(); 文档准备好后运行
            
            var banner_audio= new Audio(),        // 创建Audio.
                 webm = isSupportWebM();    // 检查是否支持webm格式
            banner_audio.src = 'media/banner_sound.mp3';
            /*if(webm) {   //支持webm格式
                banner_audio.src = 'media/banner_sound.webm';
            } else {    // 不支持webm格式
                banner_audio.src = 'media/banner_sound.mp3';
            };*/
            $('.banner')
                .bind('mouseover focusin', function() { // 当发生MouseOver,FocusIn事件时调用处理函数
                    banner_audio.load(); // 加载audio
                    banner_audio.play(); // 播放audio
                })
                .bind('mouseout focusout', function() { // 当发生MouseOut,FocusOut事件时调用处理函数
                    banner_audio.pause();             // 暂停audio
                    banner_audio.currentTime = 0;    // 初始化audio播放位置
                });
            
        });
    })(window.jQuery);
    
    // 检测是否webm格式的函数
    function isSupportWebM() {
        var tester = document.createElement('audio');
        return !!tester.canPlayType('audio/webm');
    };

     

     

    最后的完成作品:http://pan.baidu.com/s/1hsCWACs

     

    Head First 系列 https://pan.baidu.com/s/1cGiODg

     

     

    转载于:https://www.cnblogs.com/zpfbuaa/p/5456859.html

    展开全文
  • 底部横幅Android

    2021-06-09 10:31:40
    如何在屏幕底部设置横幅?我尝试了RelativeLayout,它保持在底部,但在屏幕外.那是我的简单代码:android:id="@+id/layout_home"android:layout_width="fill_parent"android:layout_height="fill_parent"android:...

    如何在屏幕底部设置横幅?

    我尝试了RelativeLayout,它保持在底部,但在屏幕外.

    那是我的简单代码:

    android:id="@+id/layout_home"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="@drawable/background"

    android:orientation="vertical">

    android:id="@+id/layout_body"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="@drawable/background2"

    android:orientation="vertical">

    ......

    android:id="@+id/layout_banner"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent" >

    ....

    更新

    我已经设置了android:layout_alignParentBottom =“ true”但没有更改

    展开全文
  • 打印一串字符,从两端到中间依次显示 效果如图 和二分查找有异曲同工之妙 注意在求长度时,下标比元素个数少一,所以减一,字符串结尾有\n所以再减去一个一,求出右下标总共需要减去二 ... char arr1[] = ...

     打印一串字符,从两端到中间依次显示

    效果如图
     

     

    和二分查找有异曲同工之妙 
    注意在求长度时,下标比元素个数少一,所以减一,字符串结尾有\n所以再减去一个一,求出右下标总共需要减去二

    int main()
    {
    	char arr1[] = "welcome to bit!!!!!!!";
    	char arr2[] = "#####################";
    	int left = 0;
    	//int right = sizeof(arr) / sizeof(arr[0]) - 2;  //减去2是因为字符串结尾有\n,
    	int right = strlen(arr1) - 1;
    	while (left <= right)
    	{
    		arr2[left] = arr1[left];//替换左下标
    		arr2[right] = arr1[right];//替换右下标
    		left++;//左下标右移一个
    		right--;//右下标左移一个
    		system("cls");//执行系统命令的一个函数-cls,效果为清空屏幕
    		printf("%s\n", arr2);
    		Sleep(1000);//休息1秒
    	}
    	
    	return 0;
    }

    展开全文
  • 有时候,UI可能会设计一个效果,需要...两种方案:UI切图自定义View实现UI切图有一些不好的地方,一是如果横幅的文字时动态变化的,那需要对应多张切图;二是切图无疑会增加APK的体积。因此我们选择「自定义View实...

    有时候,UI可能会设计一个效果,需要我们在View的左上角加上一个横幅,并在横幅上添加文字显示,例如下面这张图的效果:

    53989dc3b6cd

    image-20200902154545916.png

    紫色部分就是我们所说的“横幅”。这个效果如何实现呢?两种方案:

    UI切图

    自定义View实现

    UI切图有一些不好的地方,一是如果横幅的文字时动态变化的,那需要对应多张切图;二是切图无疑会增加APK的体积。因此我们选择「自定义View实现」。

    一、明确为「谁」而自定义

    如果我们编写一个自定义View,只是为了给自己的App使用,那么可以考虑得简单一些,不需要对外提供过多的自定义属性,也不需要考虑太多的兼容适配问题;如果是需要公开提供给广大开发者使用,那么就需要考虑提供更多的自定义属性方便大家使用。

    在这里,我决定采取后者的方式来定义这个边角横幅View。

    二、是自定义View还是自定义ViewGroup

    考虑到在各个项目中,需要加这种边角横幅的View或ViewGroup的布局差异都是非常大的,因此我们应该提供一个自定义ViewGroup,用户给需要边角横幅的View或ViewGroup套上我们的ViewGroup即可,至于用户要给什么样的内容布局加上边角横幅,我们不必关心。

    综上,最适合的就是自定义ViewGroup,继承自FrameLayout。

    三、需要暴露哪些属性

    除了在代码中提供对应属性的setter方法以外,我们还会提供XML中的自定义属性。在开始实现这个自定义View以前,我们就应该思考这个自定义View应该对外提供哪些可配置化的属性?

    观察效果图得知,需要提供以下六个属性:

    1.欲绘制的文本内容

    横幅上是要显示文字内容的,因此需要让用户能够设置文字内容。我们将欲绘制的文本内容保存到bannerText变量中,代码如下:

    var bannerText = ""

    2.横幅文本颜色

    我们将横幅中字体的颜色保存在bannerTextColor变量中,并预置一个默认的文字颜色,代码如下:

    /**

    * 横幅文字颜色

    */

    var bannerTextColor = DEFAULT_BANNER_TEXT_COLOR

    companion object {

    private const val DEFAULT_BANNER_TEXT_COLOR = Color.WHITE

    }

    3.横幅文本大小

    我们将横幅中字体的颜色保存在bannerTextSize变量中,并预置一个默认的文字大小,代码如下:

    /**

    * 横幅文字大小

    */

    var bannerTextSize = DEFAULT_BANNER_TEXT_SIZE

    companion object {

    // ...

    private val DEFAULT_BANNER_TEXT_SIZE = 12.sp

    }

    得益于Kotlin的扩展属性功能,我们可以写出如12.sp这样优雅的代码。扩展属性编写在ConvertExtension.kt中:

    internal val Float.dp: Int

    get() = TypedValue.applyDimension(

    TypedValue.COMPLEX_UNIT_DIP,

    this,

    Resources.getSystem().displayMetrics

    ).toInt()

    internal val Int.dp: Int

    get() = TypedValue.applyDimension(

    TypedValue.COMPLEX_UNIT_DIP,

    toFloat(),

    Resources.getSystem().displayMetrics

    ).toInt()

    internal val Float.sp: Int

    get() = TypedValue.applyDimension(

    TypedValue.COMPLEX_UNIT_SP,

    this,

    Resources.getSystem().displayMetrics

    ).toInt()

    internal val Int.sp: Int

    get() = TypedValue.applyDimension(

    TypedValue.COMPLEX_UNIT_SP,

    toFloat(),

    Resources.getSystem().displayMetrics

    ).toInt()

    4.横幅的背景颜色

    横幅的颜色也是可以让用户动态指定的,但我们需要预设一个默认颜色,我们将它保存到bannerBackgroundColor变量中,代码如下:

    /**

    * 横幅背景颜色

    */

    var bannerBackgroundColor = DEFAULT_BANNER_BACKGROUND_COLOR

    companion object {

    // ...

    private val DEFAULT_BANNER_BACKGROUND_COLOR = Color.parseColor("#FF8080")

    }

    5.横幅最远点距离左上角的距离

    横幅最远点的意思是什么呢?我们通过一张图来解释一下这个「横幅最远点」是什么意思:

    53989dc3b6cd

    image-20200904141659634.png

    这两条红色虚线的长度是一致的,它的长度就是「横幅最远点」距离原点的距离值,这个值会直接影响横幅在View中绘制的位置。同样这个值是可以让用户指定的,我们将它保存到bannerDistanceOriginPointLength变量中,代码如下:

    /**

    * 最远点距离View(0,0)点距离

    */

    var bannerDistanceOriginPointLength = DEFAULT_BANNER_DISTANCE_ORIGIN_POINT_LENGTH

    companion object {

    private val DEFAULT_BANNER_DISTANCE_ORIGIN_POINT_LENGTH = 60.dp

    }

    6.横幅的宽度

    通过设置横幅最远点距离,我们能够得到两个点的坐标,剩下两个点怎么确定呢?就要看横幅的宽度了,横幅宽度的定义如下图所示:

    53989dc3b6cd

    image-20200904144148587.png

    那么我们只需用横幅最远点距离 - 横幅宽度,就可以得到剩下两个点的坐标了。有了4个点的坐标,整个横幅的位置也就确定了。我们将横幅的宽度保存在bannerWidth变量中,代码如下:

    /**

    * 横幅宽度

    */

    var bannerWidth = DEFAULT_BANNER_WIDTH

    companion object {

    private val DEFAULT_BANNER_WIDTH = 26.dp

    }

    自此,完整的代码如下:

    /**

    * @author HurryYu

    * https://www.hurryyu.com

    * https://github.com/HurryYu

    * 2020-08-31

    */

    class CornerLayout @JvmOverloads constructor(

    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0

    ) : FrameLayout(context, attrs, defStyleAttr) {

    var bannerText = ""

    set(value) {

    field = value

    realDrawBannerText = value

    }

    /**

    * 真正绘制的文字,如果bannerText过长,可能会被裁剪

    */

    private var realDrawBannerText = bannerText

    /**

    * 横幅背景颜色

    */

    var bannerBackgroundColor = DEFAULT_BANNER_BACKGROUND_COLOR

    /**

    * 最远点距离View(0,0)点距离

    */

    var bannerDistanceOriginPointLength = DEFAULT_BANNER_DISTANCE_ORIGIN_POINT_LENGTH

    /**

    * 横幅宽度

    */

    var bannerWidth = DEFAULT_BANNER_WIDTH

    /**

    * 横幅文字颜色

    */

    var bannerTextColor = DEFAULT_BANNER_TEXT_COLOR

    /**

    * 横幅文字大小

    */

    var bannerTextSize = DEFAULT_BANNER_TEXT_SIZE

    companion object {

    private val DEFAULT_BANNER_BACKGROUND_COLOR = Color.parseColor("#FF8080")

    private val DEFAULT_BANNER_DISTANCE_ORIGIN_POINT_LENGTH = 60.dp

    private val DEFAULT_BANNER_WIDTH = 26.dp

    private const val DEFAULT_BANNER_TEXT_COLOR = Color.WHITE

    private val DEFAULT_BANNER_TEXT_SIZE = 12.sp

    }

    }

    四、让用户能够在XML中配置属性

    为了让用户使用更加方便,我们还需要提供自定义attrs,在res/values/attrs.xml中编写如下代码:

    并且在自定义ViewGroup中获取XML中用户设置的自定义属性值:

    init {

    initAttrs(attrs)

    }

    private fun initAttrs(attrs: AttributeSet?) {

    attrs?.let {

    context.obtainStyledAttributes(it, R.styleable.CornerLayout)

    }?.apply {

    bannerBackgroundColor = getColor(

    R.styleable.CornerLayout_bannerBackgroundColor,

    DEFAULT_BANNER_BACKGROUND_COLOR

    )

    bannerDistanceOriginPointLength = getDimensionPixelSize(

    R.styleable.CornerLayout_bannerDistanceLength,

    DEFAULT_BANNER_DISTANCE_ORIGIN_POINT_LENGTH

    )

    bannerWidth = getDimensionPixelSize(

    R.styleable.CornerLayout_bannerWidth,

    DEFAULT_BANNER_WIDTH

    )

    bannerTextColor = getColor(

    R.styleable.CornerLayout_bannerTextColor,

    DEFAULT_BANNER_TEXT_COLOR

    )

    bannerTextSize = getDimensionPixelSize(

    R.styleable.CornerLayout_bannerTextSize,

    DEFAULT_BANNER_TEXT_SIZE

    )

    bannerText = getString(R.styleable.CornerLayout_bannerText) ?: ""

    }

    }

    我们在init构造代码块中调用了initAttrs方法执行自定义属性的获取操作。

    五、绘制前的准备工作

    1.ViewGroup的onDraw默认不会调用

    通过代码:setWillNotDraw(false)即可解决。我们在init构造代码块中调用:

    init {

    initAttrs(attrs)

    setWillNotDraw(false)

    }

    2.真的要在onDraw中绘制横幅?

    我们知道,ViewGroup的onDraw调用时机是要早于它的子View的onDraw调用时机的,这样一来,如果子View设置了background,或是子View的绘制内容和我们的横幅有重叠,那么我们的横幅是会被覆盖掉的。因此我们不能在ViewGroup的onDraw中绘制横幅。

    那有哪个方法是在子View的onDraw完成后才调用的呢?答案是:onDrawForeground。

    3.得到ViewGroup的宽高

    一般情况下,用户会将我们的ViewGroup套在外层,宽高设置为wrap_content,即我们的ViewGroup的大小等于子View的大小,因此我们直接在onSizeChanged中获取ViewGroup的宽高:

    private var viewWidth = 0

    private var viewHeight = 0

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {

    super.onSizeChanged(w, h, oldw, oldh)

    viewWidth = w

    viewHeight = h

    }

    4.准备两只画笔

    除了绘制横幅的背景,我们还需要绘制横幅上的文字,因此这里为绘制横幅背景 和 绘制横幅文字 各自准备一只Paint(当然也可以只用一只Paint改变属性复用)。代码如下:

    /**

    * 边角横幅画笔

    */

    private val bannerPaint = Paint(Paint.ANTI_ALIAS_FLAG)

    /**

    * 横幅文字画笔

    */

    private val bannerTextPaint = Paint(Paint.ANTI_ALIAS_FLAG)

    init {

    initAttrs(attrs)

    bannerPaint.apply {

    color = bannerBackgroundColor

    style = Paint.Style.FILL

    }

    bannerTextPaint.apply {

    color = bannerTextColor

    textSize = bannerTextSize.toFloat()

    style = Paint.Style.FILL

    textAlign = Paint.Align.LEFT

    }

    setWillNotDraw(false)

    }

    在init中对两只画笔进行了各自的配置。到此我们所有的准备工作都做完了。除了绘制外,完整的代码如下:

    package com.hurryyu.cornerlayout

    import android.content.Context

    import android.graphics.Canvas

    import android.graphics.Color

    import android.graphics.Paint

    import android.graphics.Path

    import android.util.AttributeSet

    import android.widget.FrameLayout

    import kotlin.math.pow

    import kotlin.math.sqrt

    /**

    * @author HurryYu

    * https://www.hurryyu.com

    * https://github.com/HurryYu

    * 2020-08-31

    */

    class CornerLayout @JvmOverloads constructor(

    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0

    ) : FrameLayout(context, attrs, defStyleAttr) {

    /**

    * 边角横幅画笔

    */

    private val bannerPaint = Paint(Paint.ANTI_ALIAS_FLAG)

    /**

    * 横幅文字画笔

    */

    private val bannerTextPaint = Paint(Paint.ANTI_ALIAS_FLAG)

    /**

    * 横幅Path

    */

    private val bannerPath: Path = Path()

    private var viewWidth = 0

    private var viewHeight = 0

    var bannerText = ""

    set(value) {

    field = value

    realDrawBannerText = value

    }

    /**

    * 真正绘制的文字,如果bannerText过长,可能会被裁剪

    */

    private var realDrawBannerText = bannerText

    /**

    * 横幅背景颜色

    */

    var bannerBackgroundColor = DEFAULT_BANNER_BACKGROUND_COLOR

    /**

    * 最远点距离View(0,0)点距离

    */

    var bannerDistanceOriginPointLength = DEFAULT_BANNER_DISTANCE_ORIGIN_POINT_LENGTH

    /**

    * 横幅宽度

    */

    var bannerWidth = DEFAULT_BANNER_WIDTH

    /**

    * 横幅文字颜色

    */

    var bannerTextColor = DEFAULT_BANNER_TEXT_COLOR

    /**

    * 横幅文字大小

    */

    var bannerTextSize = DEFAULT_BANNER_TEXT_SIZE

    init {

    initAttrs(attrs)

    bannerPaint.apply {

    color = bannerBackgroundColor

    style = Paint.Style.FILL

    }

    bannerTextPaint.apply {

    color = bannerTextColor

    textSize = bannerTextSize.toFloat()

    style = Paint.Style.FILL

    textAlign = Paint.Align.LEFT

    }

    setWillNotDraw(false)

    }

    private fun initAttrs(attrs: AttributeSet?) {

    attrs?.let {

    context.obtainStyledAttributes(it, R.styleable.CornerLayout)

    }?.apply {

    bannerBackgroundColor = getColor(

    R.styleable.CornerLayout_bannerBackgroundColor,

    DEFAULT_BANNER_BACKGROUND_COLOR

    )

    bannerDistanceOriginPointLength = getDimensionPixelSize(

    R.styleable.CornerLayout_bannerDistanceLength,

    DEFAULT_BANNER_DISTANCE_ORIGIN_POINT_LENGTH

    )

    bannerWidth = getDimensionPixelSize(

    R.styleable.CornerLayout_bannerWidth,

    DEFAULT_BANNER_WIDTH

    )

    bannerTextColor = getColor(

    R.styleable.CornerLayout_bannerTextColor,

    DEFAULT_BANNER_TEXT_COLOR

    )

    bannerTextSize = getDimensionPixelSize(

    R.styleable.CornerLayout_bannerTextSize,

    DEFAULT_BANNER_TEXT_SIZE

    )

    bannerText = getString(R.styleable.CornerLayout_bannerText) ?: ""

    }

    }

    override fun onDrawForeground(canvas: Canvas) {

    super.onDrawForeground(canvas)

    }

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {

    super.onSizeChanged(w, h, oldw, oldh)

    viewWidth = w

    viewHeight = h

    }

    companion object {

    private val DEFAULT_BANNER_BACKGROUND_COLOR = Color.parseColor("#FF8080")

    private val DEFAULT_BANNER_DISTANCE_ORIGIN_POINT_LENGTH = 60.dp

    private val DEFAULT_BANNER_WIDTH = 26.dp

    private const val DEFAULT_BANNER_TEXT_COLOR = Color.WHITE

    private val DEFAULT_BANNER_TEXT_SIZE = 12.sp

    }

    }

    六、绘制横幅

    /**

    * 绘制横幅

    */

    private fun drawBanner(canvas: Canvas) {

    val x1Point = arrayOf(bannerDistanceOriginPointLength - bannerWidth.toFloat(), 0F)

    val x2Point = arrayOf(bannerDistanceOriginPointLength.toFloat(), 0F)

    val y1Point = arrayOf(0F, bannerDistanceOriginPointLength - bannerWidth.toFloat())

    val y2Point = arrayOf(0F, bannerDistanceOriginPointLength.toFloat())

    bannerPath.apply {

    reset()

    moveTo(y1Point[0], y1Point[1])

    lineTo(x1Point[0], x1Point[1])

    lineTo(x2Point[0], x2Point[1])

    lineTo(y2Point[0], y2Point[1])

    }

    canvas.drawPath(bannerPath, bannerPaint)

    }

    x1Point表示横坐标上距离原点最近的那个点,也就是用「横幅最远点距离」减去「横幅宽度」。

    x2Point表示横坐标上「横幅最远点」的坐标。

    剩下的y1Point和y2Point同理了,只不过是纵坐标。接着就是使用Path绘制了。这里需要注意绘制的顺序,因为我们等会儿绘制文字的时候,会使用drawTextOnPath来绘制。

    Path的绘制顺序如图:

    53989dc3b6cd

    image-20200904154313227.png

    七、绘制横幅文字

    可绘制文字的区域是有限的,但是用户可能传入一个很长的文本内容进行绘制,这样绘制出来的效果肯定是不好的。因此在绘制文字之前,我们需要判断可绘制文本的长度是否大于或等于欲绘制文本的长度,如果欲绘制文本的长度大于了可绘制文本的长度,则需要对用户欲绘制的文本内容进行裁剪,直到绘制内容长度小于或等于可绘制文本长度。实现的代码如下:

    /**

    * 绘制横幅上的文字

    */

    private fun drawText(canvas: Canvas) {

    // 测量欲绘制文字宽度

    val bannerTextWidth = bannerTextPaint.measureText(realDrawBannerText)

    // 计算banner最短边长度

    val bannerShortestLength =

    (sqrt(

    2 * (bannerDistanceOriginPointLength - bannerWidth).toDouble().pow(2)

    )).toFloat()

    if (bannerTextWidth > bannerShortestLength) {

    // 如果最短边长度小于欲绘制文字长度,则对欲绘制文字剪裁,直到欲绘制文字比最短边长度小方可绘制文字

    realDrawBannerText = realDrawBannerText.substring(0, realDrawBannerText.length - 1)

    drawText(canvas)

    return

    }

    }

    注意这里的bannerShortestLength是指横幅最短边的长度,如下图:

    53989dc3b6cd

    image-20200904155955630.png

    现在我们开始绘制文字,使用:canvas.drawTextOnPath(realDrawBannerText, bannerPath, 0F, 0F, bannerTextPaint),如果绘制的文本内容是:HurryYu,那么绘制出来可能是这个样子:

    53989dc3b6cd

    image-20200904162716977.png

    很显然绘制文本的基线是横幅的最短边。

    现在我们就要来看看drawTextOnPath的第3个和第4个参数的作用了。

    public void drawTextOnPath(@NonNull String text, @NonNull Path path, float hOffset, float vOffset, @NonNull Paint paint)

    hOffset:水平的偏移量

    vOffset:垂直的偏移量

    怎么计算呢?hOffset是最简单的,只需要算出横幅最短边的长度的一半,再减去绘制文本宽度的一半即可让绘制的文本水平居中了:

    val hOffset = bannerShortestLength / 2 - bannerTextWidth / 2

    vOffset就要复杂一点了,我们首先需要计算出横幅的高度,注意,这个高度不等于横幅的宽度(bannerWidth)。

    其实就是计算一个等腰梯形的高度,底边和顶边的长度是已知的,腰长也是已知的,算高度就简单了:

    // 计算banner最长边长度

    val bannerLongestLength =

    (sqrt(2 * (bannerDistanceOriginPointLength).toDouble().pow(2))).toFloat()

    // 单个直角边长度

    val oneOfTheRightAngleLength = (bannerLongestLength - bannerShortestLength) / 2

    // 计算banner的高度

    val bannerHeight =

    sqrt(bannerWidth.toDouble().pow(2) - oneOfTheRightAngleLength.pow(2)).toFloat()

    高度有了,那么vOffset就比较清晰了,它应该为bannerHeight / 2,也就是说,我们将绘制文本的基线移动到了横幅的中间。那么现在绘制出来的文字大概是这个样子:

    53989dc3b6cd

    image-20200904164008146.png

    中间那条骚紫色的虚线就是我们绘制文本内容的基线了。你会发现,文字还是没有居中,我们需要对基线做一个偏移,代码如下:

    val fontMetrics = bannerTextPaint.fontMetrics

    // 计算baseLine偏移量

    val baseLineOffset = (fontMetrics.top + fontMetrics.bottom) / 2

    val vOffset = bannerHeight / 2 - baseLineOffset

    现在的vOffset才是真正的vOffset,现在我们再使用算出来的hOffset和vOffset来绘制文字:

    canvas.drawTextOnPath(realDrawBannerText, bannerPath, hOffset, vOffset, bannerTextPaint)

    完美了。绘制横幅文字的完整代码如下:

    /**

    * 绘制横幅上的文字

    */

    private fun drawText(canvas: Canvas) {

    // 测量欲绘制文字宽度

    val bannerTextWidth = bannerTextPaint.measureText(realDrawBannerText)

    // 计算banner最短边长度

    val bannerShortestLength =

    (sqrt(

    2 * (bannerDistanceOriginPointLength - bannerWidth).toDouble().pow(2)

    )).toFloat()

    if (bannerTextWidth > bannerShortestLength) {

    // 如果最短边长度小于欲绘制文字长度,则对欲绘制文字剪裁,直到欲绘制文字比最短边长度小方可绘制文字

    realDrawBannerText = realDrawBannerText.substring(0, realDrawBannerText.length - 1)

    drawText(canvas)

    return

    }

    // a^2 + b^2 = c^2

    val hOffset = bannerShortestLength / 2 - bannerTextWidth / 2

    // 计算banner最长边长度

    val bannerLongestLength =

    (sqrt(2 * (bannerDistanceOriginPointLength).toDouble().pow(2))).toFloat()

    // 单个直角边长度

    val oneOfTheRightAngleLength = (bannerLongestLength - bannerShortestLength) / 2

    // 计算banner的高度

    val bannerHeight =

    sqrt(bannerWidth.toDouble().pow(2) - oneOfTheRightAngleLength.pow(2)).toFloat()

    val fontMetrics = bannerTextPaint.fontMetrics

    // 计算baseLine偏移量

    val baseLineOffset = (fontMetrics.top + fontMetrics.bottom) / 2

    val vOffset = bannerHeight / 2 - baseLineOffset

    canvas.drawTextOnPath(realDrawBannerText, bannerPath, hOffset, vOffset, bannerTextPaint)

    }

    八、总结

    自定义ViewGroup就完成了,用起来那就是相当爽了:

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:gravity="center"

    tools:context=".MainActivity">

    android:id="@+id/cornerLayout"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    app:bannerBackgroundColor="@color/colorPrimary"

    app:bannerDistanceLength="75dp"

    app:bannerText="限时6折"

    app:bannerTextColor="#FFFFFF"

    app:bannerTextSize="14sp"

    app:bannerWidth="34dp">

    android:layout_width="180dp"

    android:layout_height="130dp"

    android:background="@drawable/shape_book_card"

    android:gravity="center"

    android:text="安徒生童话"

    android:textColor="#FFFFFF"

    android:textSize="22sp"

    android:textStyle="bold" />

    如果对您有帮助,欢迎stat。Github:传送门

    展开全文
  • 带按钮轮换横幅广告.

    2012-04-25 17:34:34
    如何使用带按钮轮换横幅广告,制作很多的网页上的动态的图片的切换!!
  • 横幅滚动字幕

    2015-08-11 15:35:54
    VC6.0 横幅滚动字幕, 动态效果 希望对您有参考价值!
  • 现在,如果我们可以创建一个特定于我们的Spring Boot应用程序的自定义横幅并使用它代替默认的Spring Boot横幅,那将不是一件很棒的事。 有很多方法可以生成和使用Spring Boot定制横幅。 我们将详细介绍以下主题...
  • <p>I trying to produce a dynamic carousel banner to update the image, headers, text, links & alts based on the content page being viewed. ... using the bootstrap CSS framework....
  • 前言前些时间在接入一个广告sdk,遇到了一件很棘手的事情,就是接入banner广告展示时,通过sdk提供的接口,只能够获得广告展示的数据,如...动态banner广告展示的实现首先我们需要加载进来我们已经创建好的banner...
  • banner{ transition:all 2s; } banner:hover{ transform:scale(1.1); transition:all 0.5s; }
  • ;网站首页顶部横幅FLASH广告 ;150元每周;150元每周;网站全站画中画FLASH广告;... 中国润滑油动态网 地址中国北京通州区张湾镇太玉园东区1-2-501 电话8610-80893768 13121516834 传真 8610-80893768 邮编100110 E
  • 动态光圈移动flash动画是一款适合做网站横幅动画素材下载。
  • HTML+CSS+JS实现banner横幅自动切换效果

    万次阅读 2017-09-05 18:33:18
    imagebanner.html<!DOCTYPE html> <html> <title></title> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <scrip
  • 横幅广告(Banner):1.横幅广告是网络广告的常见形式,一般位于网页的醒目位置上;...一般而言,与静态横幅广告相比,动态横幅广告更醒目,更能吸引观众的注意力;4.当然这还是在恰当适合的前提下(讨厌那种...
  • css3实现动画横幅

    千次阅读 2015-09-09 18:19:48
     /*动态横幅*/  p{  background:#000;  color:#fff;font:bold 20px Tahoma,Genven,sans-serif;padding:10px;  position:absolute;right:-165px;text-align:center;top:56px;width:380px;
  • Google双击动态广告素材预览若要创建屏幕快照,整个横幅广告必须可见。 好处:1.可以一次捕获多个横幅作为单独的文件2.包含横幅大小的自动文件命名Sky Works Digital Team在本地服务器上运行横幅时,广告素材的所有...
  • 椒盐卷饼演奏横幅 从Pretzel当前正在播放的歌曲中生成横幅以在OBS中使用.Rocks使用其JSON输出 它使用当前的Python 3.X,并需要以下库: 枕头 要安装它,只需使用pip: 点安装枕头 还可以从获取Python。 为了使其...
  • 动态HTML的制作

    2021-06-09 03:33:09
    对于动态HTML效果方法的掌握,本节课选取了横幅广告管理器、悬停按钮、滚动字幕以及DHTML效果四种效果,对于学有余力的学生,可以通过资源网站进一步深入学习。l教学重点:掌握实现简单的动态HTM...
  • 横幅公司视图: 手机型号视图: 没有横幅的视图: 建造 运行ng build来构建项目。 构建工件将存储在dist/目录中。 使用--prod标志进行生产构建。 进一步的帮助 要获得有关Angular CLI的更多帮助,请使用ng help或...
  • 它为 spree 的前端提供了一种将横幅与分类单元相关联的方法,并通过后端管理视图上的配置动态更改它们。 ###Important Note Spree Enhanced Banner 项目正在进行中,将发生重大变化。 请使用它并通过打开与团队...
  • 新年了,项目中要作个动画,整体要求实现彩带乱飞,烟花冲天而起,烟花缩放,小鸡换图,小鸡飘移,横幅裁剪、展开等动画效果,全局大量使用了属性动画来实现。如下效果图:我在实现过程中,横幅的裁剪计算,捣腾了...
  • 学习了这么多的vue的指令,现在我们运用这些指令来做一个简单的动态横幅 题目要求: 在页面定义两个按钮,分别是“开始”,“停止”,还有文本“中国武汉加油!”,当单机开始的时候,文字逐渐向右循环移动!当...
  • 业务展示类网站高保真原型模板库、企业品牌官网、公司业务介绍、产品展示及营销、首页模板、内页模板、单页模板、整站模板、导航、轮播、横幅、列表、客户、案例、页脚、动态面板、母版、页面事件、窗口函数 Axure...
  • Tomcat+Mysql入门实例 滚动横幅广告创建自己的基于 Java 的滚动横幅广告 站长注:以前做过这个例子,不过好象是mysql4.012+tomcat 4 ,现在这两个软件都升级了,而且我自己正准备在一个web应用中使...
  • 动态横幅让您为 Shoppies 大肆宣传 显示您的提名的元分数 让它运行 git clone到你最喜欢的工作目录 yarn创建一个大的node_modules文件夹 将.env.example复制到.env.local并将您的放入其中 yarn dev为 Shoppies 做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,973
精华内容 1,189
关键字:

动态横幅