Android 컨트롤 부상 효과 인 스 턴 스 코드 구현
위의 그림(2)에서 보 듯 이 바로 구 매 구 매 구 조 를 위로 미 끄 러 뜨리 고 네 비게 이 션 바 의 구조 로 미 끄 러 질 때 바로 구 매 구 매 구 조 는 네 비게 이 션 바 의 구조 아래 에 붙 어 있 고 아래 의 다른 구 조 는 미 끄 러 질 수 있다.우리 가 아래로 미 끄 러 질 때 바로 구 매 구 매 구 조 는 아래로 미 끄 러 졌 다.약간 복잡 해 보이 지만 생각 을 말 하 자 갑자기 깨 달 았 을 것 이다.
우리 가 위로 미 끄 러 지 는 과정 에서 우 리 는 즉시 구 매 하 는 구조 가 네 비게 이 션 바 구조 아래로 미 끄 러 지 는 지 판단 한다.만약 에 바로 구 매 하 는 위 에 네 비게 이 션 바 에 올 라 가면 우 리 는 즉시 구 매 하 는 부상 상 자 를 새로 만들어 네 비게 이 션 바 아래 에 표시 한다.그러면 바로 구 매 하 는 것 이 네 비게 이 션 바 아래 에 붙 이 는 효 과 를 실현 할 수 있다.그리고 우리 가 아래로 미 끄 러 질 때즉시 사재 기 구조의 아래 가 방금 새로 지은 즉시 사재 기 부상 틀 의 아래 에 도 착 했 을 때 우 리 는 즉시 사재 기 부상 틀 을 제거 하고 말 하기 가 좀 어 려 울 수 있 습 니 다.생각 을 알 았 으 니 다음 에 우 리 는 효 과 를 실현 하 겠 습 니 다.
안 드 로 이 드 프로젝트 를 새로 만 들 고 이름 을 MeiTuanDemo 로 지 었 습 니 다.먼저 보고 바로 사재 기(buylayot.xml)의 레이아웃 입 니 다.여 기 는 제 가 편 의 를 위해 미 단 위 에서 그림 을 직접 캡 처 했 습 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/buy_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/buy" />
</LinearLayout>
바로 구 매 하 는 구조 가 실현 되 었 습 니 다.그 다음 에 메 인 인터페이스의 구 조 를 실현 합 니 다.그 위 에 네 비게 이 션 표시 줄 의 구 조 를 실 현 했 습 니 다.편리 함 을 위해 미국 단체 에서 캡 처 한 그림 을 직접 캡 처 한 다음 에 아래 의 ViewPager 구 조 를 통 해 바로 구 매 구 매 구 조 를 실 현 했 습 니 다.다른 구 조 는 ScrollView 안에 놓 았 습 니 다.화면 은 간단 합 니 다
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="45dip"
android:src="@drawable/navigation_bar" />
<com.example.meituandemo.MyScrollView
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/iamge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/pic"
android:scaleType="centerCrop" />
<include
android:id="@+id/buy"
layout="@layout/buy_layout" />
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/one"
android:scaleType="centerCrop" />
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/one"
android:scaleType="centerCrop" />
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/one"
android:scaleType="centerCrop" />
</LinearLayout>
</com.example.meituandemo.MyScrollView>
</LinearLayout>
위의 메 인 화면 레이아웃 에서 스크롤 뷰 가 아니 라 사용자 정의 MyScrollView 를 발견 할 수 있 습 니 다.다음은 MyScrollView 클래스 의 코드 를 보 겠 습 니 다.
package com.example.meituandemo;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
/**
* :http://blog.csdn.net/xiaanming
*
* @author xiaanming
*
*/
public class MyScrollView extends ScrollView {
private OnScrollListener onScrollListener;
/**
* MyScrollView,MyScrollView , Y ,
*/
private int lastScrollY;
public MyScrollView(Context context) {
this(context, null);
}
public MyScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
*
* @param onScrollListener
*/
public void setOnScrollListener(OnScrollListener onScrollListener) {
this.onScrollListener = onScrollListener;
}
/**
* MyScrollView MyScrollView Y , onScroll
*/
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
int scrollY = MyScrollView.this.getScrollY();
// , 5 handler
if(lastScrollY != scrollY){
lastScrollY = scrollY;
handler.sendMessageDelayed(handler.obtainMessage(), 5);
}
if(onScrollListener != null){
onScrollListener.onScroll(scrollY);
}
};
};
/**
* onTouchEvent, MyScrollView ,
* MyScrollView Y onScroll , ,
* MyScrollView , 5 handler , handler
* MyScrollView
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(onScrollListener != null){
onScrollListener.onScroll(lastScrollY = this.getScrollY());
}
switch(ev.getAction()){
case MotionEvent.ACTION_UP:
handler.sendMessageDelayed(handler.obtainMessage(), 5);
break;
}
return super.onTouchEvent(ev);
}
/**
*
*
*
* @author xiaanming
*
*/
public interface OnScrollListener{
/**
* , MyScrollView Y
* @param scrollY
* 、
*/
public void onScroll(int scrollY);
}
}
코드 를 보면 알 수 있 습 니 다.바로 ScrollView 의 스크롤 Y 값 을 감청 하 는 것 입 니 다.ScrollView 가 스크롤 감청 을 실현 하지 않 았 다 는 것 을 알 기 때문에 우 리 는 ScrollView 에 대한 감청 을 스스로 실현 해 야 합 니 다.우 리 는 자 연 스 럽 게 onTouchEvent()방법 에서 굴 러 가 는 Y 축 에 대한 감청 을 실현 할 것 이 라 고 생각 합 니 다.그러나 우리 가 ScrollView 를 미 끄 러 질 때우리 손가락 이 ScrollView 를 떠 날 때.이것 은 거 리 를 계속 미 끄 러 뜨 릴 수 있 기 때문에 사용자 의 손가락 이 떠 날 때 5 밀리초 간격 으로 ScrollView 가 미 끄 러 지 는 것 을 멈 추 었 는 지 판단 하고 ScrollView 의 스크롤 Y 값 을 OnScrollListener 인터페이스의 onScroll(int scrollY)방법 으로 되 돌려 줍 니 다.스크롤 뷰 를 호출 하기 만 하면 스크롤 뷰 를 setOnScrollListener 로 호출 하 는 방법 으로 스크롤 하 는 Y 값 을 감청 할 수 있 습 니 다.ScrollView 가 굴 러 가 는 Y 값 을 감청 하 는 것 을 실 현 했 습 니 다.다음은 간단 합 니 다.우 리 는 즉시 부상 상 자 를 사재 기 하고 부상 상 자 를 제거 하 는 것 만 표시 해 야 합 니 다.다음은 메 인 인터페이스 Activity 의 코드 작성 을 보십시오.
package com.example.meituandemo;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.LinearLayout;
import com.example.meituandemo.MyScrollView.OnScrollListener;
/**
* :http://blog.csdn.net/xiaanming
*
* @author xiaanming
*
*/
public class MainActivity extends Activity implements OnScrollListener{
private MyScrollView myScrollView;
private LinearLayout mBuyLayout;
private WindowManager mWindowManager;
/**
*
*/
private int screenWidth;
/**
* View
*/
private static View suspendView;
/**
*
*/
private static WindowManager.LayoutParams suspendLayoutParams;
/**
*
*/
private int buyLayoutHeight;
/**
* myScrollView
*/
private int myScrollViewTop;
/**
*
*/
private int buyLayoutTop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myScrollView = (MyScrollView) findViewById(R.id.scrollView);
mBuyLayout = (LinearLayout) findViewById(R.id.buy);
myScrollView.setOnScrollListener(this);
mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
screenWidth = mWindowManager.getDefaultDisplay().getWidth();
}
/**
* , , myScrollView
*/
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
buyLayoutHeight = mBuyLayout.getHeight();
buyLayoutTop = mBuyLayout.getTop();
myScrollViewTop = myScrollView.getTop();
}
}
/**
* , Y ,
* Y
*
*/
@Override
public void onScroll(int scrollY) {
if(scrollY >= buyLayoutTop){
if(suspendView == null){
showSuspend();
}
}else if(scrollY <= buyLayoutTop + buyLayoutHeight){
if(suspendView != null){
removeSuspend();
}
}
}
/**
*
*/
private void showSuspend(){
if(suspendView == null){
suspendView = LayoutInflater.from(this).inflate(R.layout.buy_layout, null);
if(suspendLayoutParams == null){
suspendLayoutParams = new LayoutParams();
suspendLayoutParams.type = LayoutParams.TYPE_PHONE; // , 2002, ,
suspendLayoutParams.format = PixelFormat.RGBA_8888;
suspendLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE; // , ,
suspendLayoutParams.gravity = Gravity.TOP; //
suspendLayoutParams.width = screenWidth;
suspendLayoutParams.height = buyLayoutHeight;
suspendLayoutParams.x = 0; // X
suspendLayoutParams.y = myScrollViewTop; //// Y
}
}
mWindowManager.addView(suspendView, suspendLayoutParams);
}
/**
*
*/
private void removeSuspend(){
if(suspendView != null){
mWindowManager.removeView(suspendView);
suspendView = null;
}
}
}
위의 코드 는 비교적 간단 합 니 다.ScrollView 가 미 끄 러 지 는 거리 에 따라 디 스 플레이 와 디 스 플레이 를 판단 하고 제거 합 니 다.디 스 플레이 상자 의 실현 은 주로 WindowManager 클래스 를 통 해 이 루어 집 니 다.이러한 addView 방법 을 사용 하여 디 스 플레이 상 자 를 추가 하고 removeView 는 디 스 플레이 상 자 를 제거 하 는 데 사 용 됩 니 다.상기 코드 를 통 해 미 단,대중 이 평가 하 는 이러한 효 과 를 실현 합 니 다.프로젝트 를 실행 하기 전에 우 리 는 반드시 AndroidManifest.xml 에
우리 프로젝트 를 실행 해서 효 과 를 봅 시다.
프로젝트 원본,다운로드 클릭
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.