2013-06-09 19 views
8

Tôi đang cố gắng đạt được hiệu ứng thị sai trong ứng dụng của mình. Tôi có một số FragmentActivity thực hiện giao diện OnPageChangeListener và nghe các sự kiện di chuyển ViewPager của tôi.Hiệu ứng thị sai của Android và Xem Máy nhắn tin

Để đạt được hiệu ứng này trong XML của tôi, tôi có LinearLayout phía sau tất cả các chế độ xem khác với nền của tôi và tôi di chuyển nó trong cuộc gọi lại onPageScrolled. Nếu tôi chỉ cần vuốt, tất cả đều ổn, hiệu ứng hoạt động và thay đổi vị trí nền. Nhưng khi ngón tay của tôi rời khỏi màn hình, nền được vẽ lại ở vị trí ban đầu của anh ấy (ngay cả khi tôi đang ở một trang mới). Tôi không thể hiểu tại sao điều này xảy ra. Đây là mã số của tôi FragmentActivity:

public class MainActivity extends FragmentActivity implements OnPageChangeListener { 

// DEFINE THE PAGEADAPTER 
private ViewPager viewPager; 
private com.angtrim.ecomilano.PagerAdapter pagerAdapter; 
private int oldPosition = 0; 
private int offSet = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // CREATE VIEWPAGER 
    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    pagerAdapter = new PagerAdapter(getApplicationContext(),getSupportFragmentManager()); 
    // SET THE ADAPTER 
    viewPager.setAdapter(pagerAdapter);   
    // SET FIRST ITEM 
    viewPager.setCurrentItem(0); 
    // SET CHANGE PAGE LISTENER 
    viewPager.setOnPageChangeListener(this);   
}  

@Override 
public void onPageScrollStateChanged(int arg0) { 
    // TODO Auto-generated method stub  
} 

@Override 
public void onPageScrolled(int arg0, float arg1, int arg2) { 

    // RIGHT SWIPE 
    if((oldPosition < arg2)) 
    {  
     offSet = (int)((arg2 - oldPosition)*0.5);    
     oldPosition = arg2; 
    } 
    // LEFT SWIPE 
    else if((oldPosition > arg2)) 
    { 
     offSet = (int) (-(oldPosition - arg2)*0.5);   
     oldPosition = arg2; 
    } 

    findViewById(R.id.backi).offsetLeftAndRight(offSet);   
} 

@Override 
public void onPageSelected(int arg0) { 
    // TODO Auto-generated method stub 

} 
} 

Cảm ơn bạn.

+0

có thể sử dụng cho nền và hiệu ứng thị sai là phụ thuộc vào chuyển động của màn hình – Prasad

Trả lời

9

Tôi biết rằng đó là một chút cũ nhưng hãy nhìn vào đó https://github.com/xgc1986/ParallaxPagerLibrary

Nó không phải override phương thức onDraw, và hiệu ứng không chỉ với hình ảnh, nó hoạt động với mọi loại xem

mPager.setPageTransformer(false, new ParallaxTransformer(R.id.parallaxContent)); 

R.id.paraallaxContent là id của Xem bạn muốn có hiệu ứng này

trừ trường hợp các giải pháp khác, không cần bất kỳ kết cấu bê tông nào để làm việc, và cũng là cách bố trí độc lập

bản demo : youtube

+0

là hiệu ứng thị sai có thể theo quan điểm pager dọc? – user1076881

2

Tôi biết câu hỏi cũ và tôi không thể trả lời câu hỏi của bạn. Nhưng, một anh chàng tên Matthieu đã tạo ra một ví dụ tuyệt vời về hiệu ứng thị sai ViewPager có thể tìm thấy tại liên kết sau.

https://github.com/MatthieuLJ/ViewPagerParallax

1

Hãy xem điều này small library Tôi đã tạo - đó là lớp con ViewPager, không yêu cầu cấu hình bổ sung để hiệu ứng thị sai hoạt động.

2

Thư viện này là hoàn toàn tùy biến trong x và y và bao gồm các hiệu ứng alpha:

https://github.com/prolificinteractive/ParallaxPager

Installation (tính v0.7, kiểm tra README để cập nhật):

  1. Thêm vào làm bạn phụ thuộc Maven Trung ương với Gradle

  2. Sử dụng tùy chỉnh ParallaxContainer trong cách bố trí XML thay vì ViewPager

  3. Tạo một file layout XML cho mỗi trang (thuộc tính x/y/alpha có thể được đặt riêng cho từng đối tượng di chuyển vào/ra khỏi trang)

  4. Có một vài dòng sao chép/dán để thêm vào onCreate của hoạt động của bạn (đầu vào README cho các dòng chính xác)

parallax planet animation

+0

Thư viện tuyệt vời, tôi sử dụng nó cho màn hình thị sai của tôi và nó hoạt động hoàn hảo. – Shirane85