• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Sir Pereira

Fade-in / out de Form

12 mensagens neste tópico

boas,

se percebi bem o teu problema, penso que este código te ajuda

Public Class Form1
    Dim tmp As Integer = 1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'este 5 e apenas para nao ficar mesmo encostado à lateral do ecra lol
        Me.Left = Screen.PrimaryScreen.WorkingArea.Width - Me.Width - 5 
        Me.Top = Screen.PrimaryScreen.WorkingArea.Height 
        'timer adicionado a form com interval = 100 ms
        Timer1.Enabled = True

    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Me.Top >= Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then
            Me.Top = Screen.PrimaryScreen.WorkingArea.Height - tmp
        ElseIf Me.Top = Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then
            Me.Timer1.Enabled = False
            Exit Sub
        End If
        tmp += 1
    End Sub
End Class

ps: só fiz o fade in :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Realmente ajudou :P

Mas podias explicar melhor o código?

E já agora como fazer o fade-out? É que como não percebi bem o código não estou a conseguir fazer o fade-out :D

Abraço e obrigado :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A classe form osetnta uma propriedade chamada Opacity.

O valor desta propriedade oscila do 0 (zero) ao 1.

Se quiseres obter por exemplo 37% de opacidade, 37/100 = 0.37 é o valor a atribuír à propriedade.

Uma regra de três simples resolve-te o problema:

Posição máxima está para 1 de opacidade assim como a Posição actual está para X de opacidade.

Uns pequenos ajustes e adaptações matemáticas e tens o problema resolvido.

Até fazia num instantinho e mostrava-te um exemplo, mas não estou nem perto de uma máquina com a IDE instalada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A classe form osetnta uma propriedade chamada Opacity.

O valor desta propriedade oscila do 0 (zero) ao 1.

Se quiseres obter por exemplo 37% de opacidade, 37/100 = 0.37 é o valor a atribuír à propriedade.

Uma regra de três simples resolve-te o problema:

Posição máxima está para 1 de opacidade assim como a Posição actual está para X de opacidade.

Uns pequenos ajustes e adaptações matemáticas e tens o problema resolvido.

Até fazia num instantinho e mostrava-te um exemplo, mas não estou nem perto de uma máquina com a IDE instalada.

Por momentos pensei que estavas a explicar o código do Soulsick, mas depois vi que não fazia sentido, e percebi o que querias dizer :P

Realmente, também era uma forma engraçada, e com o opacity eu sei trabalhar bem :D vou experimentar :)

Abraço

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sinceramente não olhei para o código do soulsick, porque só reparei na pergunta que fizeste e não no pedido de explicação...

Se até domingo à noite continuares com dúvida, eu faço-te um exemplo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

relativamente ao código do "fade-in":

Me.Top = Screen.PrimaryScreen.WorkingArea.Height

Torna o valor do top igual à altura da área visível, fazendo com que o form fique escondido.

If Me.Top > Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then

Me.Top = Screen.PrimaryScreen.WorkingArea.Height - tmp

ElseIf Me.Top = Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then

Me.Timer1.Enabled = False

Exit Sub

End If

Verifica se o valor do top é maior que o total do tamanho da área visível subtraído à altura do form:

Se for reduz ao top, de modo a que faça o efeito de subir

Se o top for igual ao tamanho da área visível - a altura do form ,significa que o form já está na "altura" máxima e não o deixa subir mais.

Atenção: No primeiro código que te dei, retira o igual na primeira comparação para que o form fique mesmo encostado à barra de tarefas. :P

e agora quanto ao fade out:

Basicamente é o contrario do fade in  lol :)

Me.Top = Screen.PrimaryScreen.WorkingArea.Height - Me.Height

Atribui ao top o valor da área visível - a altura do form, de modo a que este fique a ver-se.

If Me.Top < Screen.PrimaryScreen.WorkingArea.Height Then

Me.Top = Screen.PrimaryScreen.WorkingArea.Height - Me.Height + tmp

ElseIf Me.Top = Screen.PrimaryScreen.WorkingArea.Height Then

Me.Timer1.Enabled = False

Exit Sub

End If

Verifica se o valor do top é menor que o tamanho da área visível:

Se for então atribui a top o valor da área visível - a altura do form + tmp, ou seja faz com que o top seja maior fazendo o efeito de descer.

Se o valor do top for igual ao tamanho da área visível, significa que já está completamente escondido e sai.

Presumo que te tenhas apercebido que só precisas de trocar os excertos de código uns pelos outros para obteres o efeito que desejas:P

Se houver alguma dúvida, avisa que eu não sou muito bom a explicar coisas lol :-[

cumps ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fade pode-se traduzir em "desvanecer".

Onde o Soulsick escreve "fade-in" leia-se antes "slide-up" e onde escreve "fade-out", leia-se antes "slide-down".

Para obteres o efeito "FADE" continuas a precisar da opacidade e a tal regra de 3 simples.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm, porquê complicar?

Timer com intervalo de 1 e com o código:

Me.Opacity -= 0.01
If Me.Opacity = 0 Then Application.Exit()

Quando quiseres que faça o efeito:

Timer1.Enabled = "true"

Nada de génio, mas funcional  :)

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ideia e tornar o form mais opaco ou mais transparente consoante a posição vertical em que se encontra.

Não queiram fugir à matemática :nono1:

Eu já meto aqui um exemplo, como prometi.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um bocado em cima do joelho, mas aí está um exemplo.

(sem grandes cálculos, por isso é que ando sempre com valores de ajuste de um lado para o outro)

Gosto de utilizar atenuadores de movimento, o que pode complicar um pouco o código e a sua percepção... mas para qualquer esclarecimento tou cá.

Deve, no mínimo, chegar para te dar uma ideia.

Se quiseres uma cena mais simples... melhor.

Todos os controlos são adicionados em runtime para minimizar os erros no copy/paste.

Para veres o exemplo, só precisas de 2 forms e no startup form (o Form1 por defeito) adicionas um botão, onde vais meter este código:

        Dim F As New Form2

        F.Show()
        F.Mostrar("Que cena marada!", 5)

Depois substituí todo o código do form2 para este:

Public Class Form2
    Private WithEvents TMR As New Timer
    Private WithEvents Temporizador As New Timer
    Private MSG As New Label

    Private ValorVerticalMin As Integer = 0
    Private ValorVerticalMax As Integer = 0
    Private ValorHorizontal As Integer = 0
    Private Dir As Direccao = Nothing

    Private Enum Direccao
        Mostrar
        Esconder
        Parado
    End Enum

    ''' <summary>
    ''' Mostrar o "popup"
    ''' </summary>
    ''' <param name="Texto">Texto a apresentar (nada de centrado nem isso, apenas para demonstrar)</param>
    ''' <param name="Tempo">Tempo em segundos</param>
    ''' <remarks></remarks>
    Public Sub Mostrar(ByVal Texto As String, ByVal Tempo As Integer)
        Dir = Direccao.Mostrar
        MSG.Text = Texto
        TMR.Enabled = True
        Temporizador.Interval = Tempo * 1000
    End Sub

    Private Sub RepetidorMovimento(ByVal sender As Object, ByVal e As System.EventArgs) Handles TMR.Tick
        Select Case Dir

            Case Direccao.Esconder
                Dim Modificador As Double = ((ValorVerticalMin + 24) - Me.Top) * 0.05
                If Modificador > 1 Then
                    Me.Top += Modificador
                    Me.Opacity = VerificaOpacidade()
                Else
                    TMR.Enabled = False
                    Dir = Direccao.Parado
                    Me.Close()
                End If

            Case Direccao.Mostrar
                Dim Modificador As Double = (Me.Top - (ValorVerticalMax + 24)) * 0.05
                If Modificador > 1 Then
                    Me.Top -= Modificador
                    Me.Opacity = VerificaOpacidade()
                Else
                    TMR.Enabled = False
                    Dir = Direccao.Parado
                    Temporizador.Enabled = True
                End If

        End Select
    End Sub

    Private Function VerificaOpacidade() As Double
        Dim OffsetMax As Integer = ValorVerticalMin - ValorVerticalMax
        Dim OffsetPos As Integer = ValorVerticalMin - Me.Top

        Return (OffsetPos / OffsetMax) + 0.2
    End Function

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        TMR.Interval = 1
        TMR.Enabled = False

        ValorVerticalMax = My.Computer.Screen.WorkingArea.Height - Me.Height
        ValorVerticalMin = My.Computer.Screen.WorkingArea.Height
        ValorHorizontal = My.Computer.Screen.WorkingArea.Width - Me.Width - 3

        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        Me.Top = ValorVerticalMin
        Me.Left = ValorHorizontal
        Me.BackColor = Color.White

        Temporizador.Enabled = False

        With MSG
            .AutoSize = False
            .Top = 2
            .Left = 2
            .Width = Me.Width - 4
            .Height = Me.Height - 4
        End With

        Me.Controls.Add(MSG)
    End Sub

    Private Sub TemporizadorParaEsconder(ByVal sender As Object, ByVal e As System.EventArgs) Handles Temporizador.Tick
        Dir = Direccao.Esconder
        TMR.Enabled = True
        Temporizador.Enabled = False
    End Sub
End Class

Há maneiras mais fáceis? Há. Tudo depende da maneira como queres utilizar.

Só um remark, adiciono 0.2 à opacidade na função que retorna a opacidade por causa do factor 0.05 que uso para atenuar o movimento.

Há maneiras matemáticas de dar a volta a isto e ficar certinho, mas não valia a pena para aqui.

EDIT: Se o que pretendes é apenas um Fade in/out, o código fica brutalmente mais fácil. Diz qualquer coisa assim que tentares. Posso ter percebido mal o que pretendes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fade pode-se traduzir em "desvanecer".

Onde o Soulsick escreve "fade-in" leia-se antes "slide-up" e onde escreve "fade-out", leia-se antes "slide-down".

Para obteres o efeito "FADE" continuas a precisar da opacidade e a tal regra de 3 simples.

sim eu sei  :) e eu até coloquei o fade-in entre "" mas o fade-out passou-me. Apenas utilizei as designações que o sir pereira deu  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora