2017-03-15 4 views
1

본질적으로 대화 상자 안에 두 개의보기가 있습니다. A buttonLinearLayout이 있습니다. 이 LinearLayoutCircularReveal으로 단추의 중심에서 움직여서 전체 대화 상자가 색상으로 덮 이도록하려고합니다.대화 상자 내에서 시선을 얻을 수 없습니다.

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <ScrollView android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/white"> 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      ... 

      <com.dd.CircularProgressButton 
       android:id="@+id/sign_in_enter_button" 
       android:layout_gravity="bottom|center_horizontal" 
       android:layout_width="match_parent" 
       android:layout_height="42dp" 
       android:layout_marginRight="24dp" 
       android:layout_marginLeft="24dp" 
       android:textColor="@android:color/white" 
       android:textSize="15dp" 
       app:cpb_cornerRadius="1dp" 
       app:cpb_textIdle="@string/login_sign_in" 
       app:cpb_iconComplete="@drawable/ic_done_mini" 
       app:cpb_selectorIdle="@color/morph_button_idle_colors" 
       app:cpb_selectorComplete="@color/morph_button_complete_colors" 
       app:cpb_colorIndicator="@color/colorAccent" 
       app:cpb_colorIndicatorBackground="@android:color/transparent" 
       app:cpb_colorProgress="@android:color/transparent"/> 

      ... 

     </LinearLayout> 

    </ScrollView> 

    <!-- Background to be animated behind the CircularProgressButton --> 
    <LinearLayout 
     android:id="@+id/sign_in_dialog_background" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:visibility="invisible" 
     android:layout_gravity="center" 
     android:gravity="center" 
     android:background="@color/colorAccent"> 

     ... 

    </LinearLayout> 

</FrameLayout> 

이미 내 응용 프로그램의 다른 곳에서 사용했습니다 나는이 방법을 사용했습니다이 애니메이션을 수행하고 :

내가 대화로 사용하는 XML이다 완벽하게 작동합니다 :

final CircularProgressButton enterButton = (CircularProgressButton) parent.findViewById(R.id.sign_in_enter_button); 

... 

// This is called inside a listener, so the button is already drawn. 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
{ 
    int enterButtonX = (enterButton.getLeft() 
      + enterButton.getRight())/2; 

    int enterButtonY = ((int) enterButton.getY() 
      + enterButton.getHeight())/2; 

    View background = mAlertDialogView.findViewById(R.id.sign_in_dialog_background); 

    int radiusReveal = Math.max(background.getWidth() 
      , background.getHeight()); 

    background.setVisibility(View.VISIBLE); 

    Animator animator = 
      android.view.ViewAnimationUtils.createCircularReveal(background 
        , enterButtonX 
        , enterButtonY 
        , 0 
        , radiusReveal); 

    animator.setDuration(500); 
    animator.setInterpolator(
      AnimationUtils.loadInterpolator(LoginUI.this, R.anim.accelerator_interpolator)); 

    animator.start(); 
} 

좌표가 버튼에 근접하지 않습니다. 사실, 애니메이션은 대화 상자의 중심에서부터 시작됩니다.

내가 잘못하고있는 것에 대한 아이디어가 있습니까?

감사합니다,

+0

중력이 center_horizontal이고 가로로 여백을 고정했는데 왜 필요합니까? 또한 당신이 중력을 가지고 있기 때문에 높이에 관해서는 높이가 포장 내용이 아니라면 원하는대로 표시되지 않습니다 –

+0

간단한 프로젝트를 어딘가에 게시 할 수 있습니까? – azizbekian

+0

@TasdAqwe 당신은 무엇을 의미합니까? center_horizontal은 match_parent를 사용할 때 필요하지 않을 수도 있지만 여전히 원하는대로 표시됩니다. – cuoka

답변

1

이 그것을 수행해야합니다

public void startCircularReveal() { 
    final View view = findViewById(R.id.revealView); 
    final View startView = findViewById(R.id. button); 
    int cx = (startView.getLeft() + startView.getRight())/2; 
    int cy = (startView.getTop() + startView.getBottom())/2; 
    view.setBackgroundColor(Color.parseColor("#6FA6FF")); 
    int finalRadius = Math.max(cy , view.getHeight() - cy); 
    Animator anim = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius); 
    anim.addListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationStart(Animator animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 

     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 

     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 

     } 
    }); 
    anim.setDuration(200); 
    view.setVisibility(View.VISIBLE); 
    anim.start(); 
} 

변경하여 버튼에보기 startView 및 완료되어 공개 한 후 당신이 원하는 무엇이든 할 onAnimationEnd.

이제 XML의 바닥에 이것을 추가 : (가), (시작시 명명 된 뷰 startCircularReveal() 메소드)의 상단에있을 것 계시가 도움이되기를 바랍니다 곳

<FrameLayout 
    android:id="@+id/revealView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/custom_theme_color" 
    android:orientation="vertical" 
    android:visibility="invisible"> 
</FrameLayout> 

이보기입니다.

+0

죄송합니다. 내 코드와 어떤 차이점이 보이지 않습니다. 변경 한 내용을 말씀해 주시겠습니까? – cuoka

+0

글쎄, 당신의 코드를 확인하지 않았지만 그 코드를 한 시간 전에 썼다. 그리고 잘 드러내는 배경으로, LinearLayout을 사용하는 동안 모든 것을 맨 위에있는 FrameLayout을 사용한다. LinearLayout은 계시가 그 위에 일어날 것이기 때문에 정상에있을 것입니다. btw 내 코드를 시도했는데 작동하지 않았습니까? –

+0

FrameLayout은 버튼과 배경이 포함 된 컨테이너이므로 버튼의 맨 위에 배경이 표시됩니다. 배경이 LinearLayout인지 FrameLayout인지는 중요하지 않습니다. BTW 내가 지금 당신의 코드를 시도 할 수는 없지만, 분명히 내 것과 동일합니다. – cuoka