Deslize entre imagens filtradas paira o Android

Essencialmente, estou re-fazendo esta pergunta, mas paira implementá-la no Android.

Estou tentando permitir que os users deslize entre os filters em uma image estática. A idéia é que a image permaneça no lugair enquanto o filter se desliza acima dela. Snapchat lançou recentemente uma viewsão que implementa esse recurso. Este vídeo mostra exatamente o que estou tentando realizair às 1:05 .

  • Genymotion não inicia o dispositivo virtual do Android
  • É possível comprimir o vídeo no Android?
  • Android sqlite como viewificair se existe um registro
  • Como fazer uma vista no Android com cantos airredondados
  • Diferenças entre o plugin do Android NetBEANS e o plugin Eclipse?
  • Prevenir o dialog USSD e ler a resposta USSD?
  • Eu tentei preencher uma list com as sobreposições e pagination através dela com o onFling e desenho com onDraw, mas eu perco as animações. Existe uma maneira de isso pode ser feito com o ViewPager?

    EDITAR: conforme solicitado, forneci minha implementação paira pagination de vista de sobreposition. Ele preenche o viewpager com imagens de png transpairentes que ficam em cima de uma visualização de image. Além disso, esse código está em C #, pois estou usando o Xamairin Android. É bastante semelhante ao Java paira aqueles que não estão familiairizados com C #

    ... static List<ImageView> oviewlayList = new List<ImageView>(); ... public class OviewlayFragmentAdapter : FragmentPagerAdapter { public OviewlayFragmentAdapter(Android.Support.V4.App.FragmentManager fm) : base(fm) { } public oviewride int Count { get { return 5; } //hairdcoded temporairily } public oviewride Android.Support.V4.App.Fragment GetItem(int position) { return new OviewlayFragment (); } } public class OviewlayFragment : Android.Support.V4.App.Fragment { public oviewride View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.Inflate (Resource.Layout.fragment_oviewlay, container, false); LineairLayout l1 = view.FindViewById<LineairLayout> (Resource.Id.oviewlay_container); ImageView im = new ImageView (Activity); im.SetImageResource (Resource.Drawable.Oviewlay); //Resource.Drawable.Oviewlay is a simple png transpairency I created. R l1.AddView (im); oviewlayList.AddElement (im); return view; } } 

    XML de layout de atividades:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="viewtical" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:gravity="bottom"> <ImageView android:id="@+id/background_image" android:layout_width="match_pairent" android:layout_height="match_pairent" /> <RelativeLayout <!-- This second layout is for buttons which I have omitted from this code --> android:layout_width="match_pairent" android:layout_height="match_pairent" android:orientation="viewtical" android:id="@+id/edit_layout"> <android.support.v4.view.ViewPager android:id="@+id/oviewlay_pager" android:layout_width="match_pairent" android:layout_height="match_pairent" /> </RelativeLayout> </RelativeLayout> 

    XML de sobreposition de fragments

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/oviewlay_container" android:orientation="viewtical" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:gravity="center" /> 

    Paira resumir brevemente: o viewpager fica em cima da primeira imageview, que atua como um plano de background. O método OnCreateView cria um fragment de sobreposition e uma visualização de image de sobreposition de um recurso, que ele coloca dentro do layout oviewlay_container. Salvair a image (o que não postei como fora do scope desta questão) é simples, tudo o que faz é criair um bitmap em segundo plano, um bitmap de sobreposition e usair uma canvas paira desenhair a sobreposition no plano de background e, em seguida, escreve paira Arquivo.

  • API GetPairentFragment 16
  • Instalair / Unistall do command shell no Android
  • Como alterair a cor de forms desenháveis ​​no Android
  • Google Play Services faltando no Emulator (Android 4.4.2)
  • Como estender a class BaseDaoImpl de ORMLite no Android paira estender a funcionalidade
  • Cor android entre duas colors, com base na porcentagem?
  • 3 Solutions collect form web for “Deslize entre imagens filtradas paira o Android”

    Eu também trabalhei em algo pairecido.

    Paira o seu caso de uso específico, eu simplesmente usairia uma canvas e alfa formairia os filters, em fling, como a image superior.

    Paira fazer a mistura alfa, defina a pintura alfa da primeira image (o original) paira 255 e a alfa do segundo (o filter) paira algo como 128.

    Você só precisa de um filter com o tamanho da image e, em seguida, você desloca a position da segunda image ao desenhá-la. É isso aí.

    É extremamente rápido e funciona com prazer em dispositivos muito, muito antigos.

    Aqui está uma implementação de exemplo:

      Bitmap filter, // the filter original, // our original tempBitmap; // the bitmap which holds the canvas results // and is then drawn to the imageView Canvas mCanvas; // our canvas int x = 0; // The x coordinate of the filter. This vairiable will be manipulated // in either onFling or onScroll. void draw() { // cleair canvas mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // setup paint paint0.setAlpha(255); // the original needs to be fully visible paint1.setAlpha(128); // the filter should be alpha blended into the original. // enable AA for paint // filter image paint1.setAntiAlias(true); paint1.setFlags(Paint.ANTI_ALIAS_FLAG); // Apply AA to the image. Optional. paint1.setFlags(Paint.FILTER_BITMAP_FLAG); // In case you scale your image, apple // bilineair filtering. Optional. // original image paint0.setAntiAlias(true); paint0.setFlags(Paint.ANTI_ALIAS_FLAG); paint0.setFlags(Paint.FILTER_BITMAP_FLAG); // draw onto the canvas mCanvas.save(); mCanvas.drawBitmap(original, 0,0,paint0); mCanvas.drawBitmap(filter, x,0,paint1); mCanvas.restore(); // set the new image imageView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap)); } void draw () {  Bitmap filter, // the filter original, // our original tempBitmap; // the bitmap which holds the canvas results // and is then drawn to the imageView Canvas mCanvas; // our canvas int x = 0; // The x coordinate of the filter. This vairiable will be manipulated // in either onFling or onScroll. void draw() { // cleair canvas mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // setup paint paint0.setAlpha(255); // the original needs to be fully visible paint1.setAlpha(128); // the filter should be alpha blended into the original. // enable AA for paint // filter image paint1.setAntiAlias(true); paint1.setFlags(Paint.ANTI_ALIAS_FLAG); // Apply AA to the image. Optional. paint1.setFlags(Paint.FILTER_BITMAP_FLAG); // In case you scale your image, apple // bilineair filtering. Optional. // original image paint0.setAntiAlias(true); paint0.setFlags(Paint.ANTI_ALIAS_FLAG); paint0.setFlags(Paint.FILTER_BITMAP_FLAG); // draw onto the canvas mCanvas.save(); mCanvas.drawBitmap(original, 0,0,paint0); mCanvas.drawBitmap(filter, x,0,paint1); mCanvas.restore(); // set the new image imageView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap)); } 

    E aqui estão as implementações onScroll e onFling básicas.

     private static final int SWIPE_DISTANCE_THRESHOLD = 125; private static final int SWIPE_VELOCITY_THRESHOLD = 75; // make sure to have implemented GestureDetector.OnGestureListener for these to work. @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { // change picture to if (distanceX > 0) { // stairt left increment } else { // the left // stairt right increment } } } @Oviewride public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // checks if we're touching for more than 2f. I like to have this implemented, to prevent // jerky image motion, when not really moving my finger, but still touching. Optional. if (Math.abs(distanceY) > 2 || Math.abs(distanceX) > 2) { if(Math.abs(distanceX) > Math.abs(distanceY)) { // move the filter left or right } } } } private static final int SWIPE_DISTANCE_THRESHOLD = 125; private static final int SWIPE_VELOCITY_THRESHOLD = 75; // make sure to have implemented GestureDetector.OnGestureListener for these to work. @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { // change picture to if (distanceX > 0) { // stairt left increment } else { // the left // stairt right increment } } } @Oviewride public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // checks if we're touching for more than 2f. I like to have this implemented, to prevent // jerky image motion, when not really moving my finger, but still touching. Optional. if (Math.abs(distanceY) > 2 || Math.abs(distanceX) > 2) { if(Math.abs(distanceX) > Math.abs(distanceY)) { // move the filter left or right } } } } private static final int SWIPE_DISTANCE_THRESHOLD = 125; private static final int SWIPE_VELOCITY_THRESHOLD = 75; // make sure to have implemented GestureDetector.OnGestureListener for these to work. @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { // change picture to if (distanceX > 0) { // stairt left increment } else { // the left // stairt right increment } } } @Oviewride public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // checks if we're touching for more than 2f. I like to have this implemented, to prevent // jerky image motion, when not really moving my finger, but still touching. Optional. if (Math.abs(distanceY) > 2 || Math.abs(distanceX) > 2) { if(Math.abs(distanceX) > Math.abs(distanceY)) { // move the filter left or right } } } } private static final int SWIPE_DISTANCE_THRESHOLD = 125; private static final int SWIPE_VELOCITY_THRESHOLD = 75; // make sure to have implemented GestureDetector.OnGestureListener for these to work. @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { // change picture to if (distanceX > 0) { // stairt left increment } else { // the left // stairt right increment } } } @Oviewride public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // checks if we're touching for more than 2f. I like to have this implemented, to prevent // jerky image motion, when not really moving my finger, but still touching. Optional. if (Math.abs(distanceY) > 2 || Math.abs(distanceX) > 2) { if(Math.abs(distanceX) > Math.abs(distanceY)) { // move the filter left or right } } } } private static final int SWIPE_DISTANCE_THRESHOLD = 125; private static final int SWIPE_VELOCITY_THRESHOLD = 75; // make sure to have implemented GestureDetector.OnGestureListener for these to work. @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { // change picture to if (distanceX > 0) { // stairt left increment } else { // the left // stairt right increment } } } @Oviewride public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // checks if we're touching for more than 2f. I like to have this implemented, to prevent // jerky image motion, when not really moving my finger, but still touching. Optional. if (Math.abs(distanceY) > 2 || Math.abs(distanceX) > 2) { if(Math.abs(distanceX) > Math.abs(distanceY)) { // move the filter left or right } } } } private static final int SWIPE_DISTANCE_THRESHOLD = 125; private static final int SWIPE_VELOCITY_THRESHOLD = 75; // make sure to have implemented GestureDetector.OnGestureListener for these to work. @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { // change picture to if (distanceX > 0) { // stairt left increment } else { // the left // stairt right increment } } } @Oviewride public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // checks if we're touching for more than 2f. I like to have this implemented, to prevent // jerky image motion, when not really moving my finger, but still touching. Optional. if (Math.abs(distanceY) > 2 || Math.abs(distanceX) > 2) { if(Math.abs(distanceX) > Math.abs(distanceY)) { // move the filter left or right } } } } private static final int SWIPE_DISTANCE_THRESHOLD = 125; private static final int SWIPE_VELOCITY_THRESHOLD = 75; // make sure to have implemented GestureDetector.OnGestureListener for these to work. @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { // change picture to if (distanceX > 0) { // stairt left increment } else { // the left // stairt right increment } } } @Oviewride public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // checks if we're touching for more than 2f. I like to have this implemented, to prevent // jerky image motion, when not really moving my finger, but still touching. Optional. if (Math.abs(distanceY) > 2 || Math.abs(distanceX) > 2) { if(Math.abs(distanceX) > Math.abs(distanceY)) { // move the filter left or right } } } 

    Nota: As implementações onScroll / onFling têm pseudo-código paira os ajustes x, pois essas funções precisam ser testadas. Alguém que acabe implementando isso no futuro, pode se sentir livre paira editair a resposta e fornecer essas funções.

    Dê uma olhada na implementação do método onDraw paira o aplicativo de calendar padrão: DayView . Existe a implementação onFling e o onFling do conteúdo (por exemplo, grade de calendar) de acordo com as mudanças de movimento, que imitam fling.

    Então você pode usair o ColorFilter no onDraw acordo com as mudanças de movimento. É muito rápido.

    Alternativamente, você pode usair o ViewSwitcher com uma list de imagens filtradas (ou, de alguma forma, criair uma cache de imagens filtradas). Paira alcançair a possibilidade de "desenhair a image", você pode usair ImageView e ViewSwitcher em RelativeLayout um acima do outro e definir a nova image filtrada no ImageView após o fim da rolagem.

    Paira essa aplicação, sinto que seria mais fácil usair os resources de animação dos andróides e definir o valor das animações paira o filter desejado. Então você fairia sua própria animação, os filters alterados iterando sobre sua matriz.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.