Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Efecto marquesina para diseño lineal

Estoy intentando implementar el efecto de la carpa a la disposición para ayudarlo a desplazar / animar de lado interno derecho al lado interno izquierdo apenas como la opinión del ticker.

De los dos enlaces siguientes, usted sería capaz de obtener más conocimientos, así como los mercados de valores mantener a los usuarios actualizados, mostrando los valores en una forma circular constante.

  • Lista de retención en el fragmento de lista sobre el cambio de orientación
  • Codificar wav a AAC en Android
  • Cómo almacenar un objeto Date en SharedPreferences?
  • Cargando jQuery desde activos locales en Android para una página html remota
  • Porting C ++ lib / app en android
  • Evita la rotación de la pantalla en Android
  • 1) http://www.sify.com/finance/livemarkets/

    2) http://terminal.moneycontrol.com/index.php?wl=indices

    Para esto he implementado código a continuación para hacer algo similar.

    public class HorizonalSlideActivity extends Activity { private LinearLayout horizontalOuterLayout; private HorizontalScrollView horizontalScrollview; private int scrollMax; private int scrollPos = 0; private TimerTask scrollerSchedule; private Timer scrollTimer = null; private ScrollAdapter adapter = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.horizontal_layout); adapter = new ScrollAdapter(HorizonalSlideActivity.this); horizontalScrollview = (HorizontalScrollView) findViewById(R.id.horiztonal_scrollview_id); horizontalScrollview.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return false; } }); horizontalOuterLayout = (LinearLayout) findViewById(R.id.horiztonal_outer_layout_id); horizontalTextView = (TextView) findViewById(R.id.horizontal_textview_id); horizontalScrollview.setHorizontalScrollBarEnabled(false); addData(); ViewTreeObserver vto = horizontalOuterLayout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { horizontalOuterLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); getScrollMaxAmount(); startAutoScrolling(); } }); } private void addData() { for (int i = 0; i < adapter.getCount(); i++) { View convertView = adapter.getView(i, null, null); horizontalOuterLayout.addView(convertView); } } public void getScrollMaxAmount() { Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; Log.e("getScrollMaxAmount", "getWidth == "+width); Log.e("getScrollMaxAmount", "getMeasuredWidth == "+horizontalOuterLayout.getMeasuredWidth()); int actualWidth = (horizontalOuterLayout.getMeasuredWidth() - width); Log.e("getScrollMaxAmount", "actualWidth == "+actualWidth); scrollMax = actualWidth; Log.e("getScrollMaxAmount", "scrollMax == "+scrollMax); } public void startAutoScrolling() { if (scrollTimer == null) { scrollTimer = new Timer(); final Runnable TimerTick = new Runnable() { public void run() { moveScrollView(); } }; if (scrollerSchedule != null) { scrollerSchedule.cancel(); scrollerSchedule = null; } scrollerSchedule = new TimerTask() { @Override public void run() { runOnUiThread(TimerTick); } }; scrollTimer.schedule(scrollerSchedule, 3000, 30); } } public void moveScrollView() { Log.e("moveScrollView", "scrollMax == "+scrollMax); scrollPos = (int) (horizontalScrollview.getScrollX() + 1.0); Log.e("moveScrollView", "scrollPos == "+scrollPos); if (scrollPos >= scrollMax) { scrollPos = 0; } horizontalScrollview.scrollTo(scrollPos, 0); } public void stopAutoScrolling() { if (scrollTimer != null) { scrollTimer.cancel(); scrollTimer = null; } } public void onBackPressed() { super.onBackPressed(); finish(); } public void onPause() { super.onPause(); finish(); } public void onDestroy() { clearTimerTaks(scrollerSchedule); clearTimers(scrollTimer); scrollerSchedule = null; scrollTimer = null; super.onDestroy(); } private void clearTimers(Timer timer) { if (timer != null) { timer.cancel(); timer = null; } } private void clearTimerTaks(TimerTask timerTask) { if (timerTask != null) { timerTask.cancel(); timerTask = null; } } } 

    Aquí está el diseño de este archivo:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <HorizontalScrollView android:id="@+id/horiztonal_scrollview_id" android:layout_width="match_parent" android:layout_height="wrap_content" android:fadingEdge="none" > <LinearLayout android:id="@+id/horiztonal_outer_layout_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ffffff" android:gravity="center_vertical" android:orientation="horizontal" android:paddingBottom="5dip" android:paddingTop="5dip" > </LinearLayout> </HorizontalScrollView> </LinearLayout> 

    Clase del adaptador para mostrar los datos:

     public class ScrollAdapter extends BaseAdapter { private Context context; public ScrollAdapter(Context context) { this.context = context; } @Override public int getCount() { return 10; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); convertView = inflater.inflate(R.layout.scroll_child, null); return convertView; } } 

    Y su archivo xml:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/txtPercent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="30dp" android:paddingRight="30dp" android:text="0.14%" /> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@android:color/white" /> <TextView android:id="@+id/txtData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="30dp" android:paddingRight="30dp" android:text="data" /> </LinearLayout> 

    Mediante la implementación de esto, un poco más cerca, pero no podía hacer lo que se desea. Por favor, ayúdame a hacerlo circular sin ninguna interrupción y reinicie el desplazamiento después de que los últimos datos se muevan dentro desde el lado izquierdo.

    Aquí está el resultado deseado:

    Introduzca aquí la descripción de la imagen

    También he comprobado este acoplamiento , él da el efecto del desplazamiento qué es necesario pero no demuestra los datos enteros, sus demostraciones solamente 3 a 4 pareceres pero como usted puede ver que he agregado 10 datos en clase del adaptador.

    Cualquier tipo de ayuda sería apreciable.

    Gracias por adelantado.

  • ¿Cómo puedo restaurar un Fragmento visualizado anteriormente?
  • Crouton depende de las bibliotecas, pero no es una biblioteca en sí
  • Evitar copias múltiples de un servicio de Android
  • Cámara frontal Android Camera2
  • ¿Puedo desarrollar Android en Mac?
  • Android: actualización de la barra de progreso para la carga de archivos
  • 2 Solutions collect form web for “Efecto marquesina para diseño lineal”

    Puede lograrse utilizando Recycleview y una ejecución automática. agregando el fragmento de código aquí

    1. MainActivity (MarqueeViewSample.java)

     package com.test.mo.test; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; /** * Created by jovin.pj on 29-07-2015. */ public class MarqueeViewSample extends Activity { private final Runnable SCROLLING_RUNNABLE = new Runnable() { @Override public void run() { final int duration = 10; final int pixelsToMove = 10; marqueList.smoothScrollBy(pixelsToMove, 0); mHandler.postDelayed(this, duration); } }; private final Handler mHandler = new Handler(Looper.getMainLooper()); private RecyclerView marqueList; //private boolean loading = true; private boolean foundTotalPixel = true; private int pastVisiblesItems, visibleItemCount, totalItemCount; private int totalMovedPixel; private int totalPixel; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); marqueList = (RecyclerView) findViewById(R.id.marqueList); final LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); marqueList.setLayoutManager(layoutManager); marqueList.setAdapter(new ScrollAdapter()); marqueList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { totalMovedPixel = totalMovedPixel + dx; visibleItemCount = layoutManager.getChildCount(); totalItemCount = layoutManager.getItemCount(); pastVisiblesItems = layoutManager.findFirstVisibleItemPosition(); if (foundTotalPixel) { if (totalItemCount > 2) { View headerView = layoutManager.getChildAt(0); View itemView = layoutManager.getChildAt(1); if (itemView != null && headerView != null) { /*total visible scrolling part is total pixel's of total item's count and header view*/ totalPixel = /*-c.getTop() +*/ ((totalItemCount - 2) * itemView.getWidth()) + (1 * headerView.getWidth()); Log.v("...", "Total pixel x!" + totalPixel); foundTotalPixel = false; } } } //if (loading) { //if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { if (!foundTotalPixel && totalMovedPixel >= totalPixel) { // loading = false; Log.v("...", "Last Item Wow !"); Log.v("...", "totalMovedPixel !" + totalMovedPixel); // use this to turn auto-scrolling off: //mHandler.removeCallbacks(SCROLLING_RUNNABLE); marqueList.setAdapter(null); marqueList.setAdapter(new ScrollAdapter()); pastVisiblesItems = visibleItemCount = totalItemCount = 0; totalMovedPixel = 0; } } // } }); // use this to turn auto-scrolling on: mHandler.post(SCROLLING_RUNNABLE); } } 

    2. SampleAdapter (ScrollAdapter.java)

     package com.test.mo.test; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; /** * Created by jovin.pj on 29-07-2015. */ public class ScrollAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int TYPE_HEADER = 0; private static final int TYPE_ITEM = 1; private static final int TYPE_FOOTER = 2; @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder viewHolder = null; if (viewType == TYPE_ITEM) { //inflate your layout and pass it to view holder View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.scroll_child, parent, false); viewHolder = new ViewHolderItem(view); } else if (viewType == TYPE_HEADER || viewType == TYPE_FOOTER) { //inflate your layout and pass it to view holder //View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header_footer, parent, false); View view = new View(parent.getContext()); DisplayMetrics metrics = parent.getContext().getResources().getDisplayMetrics(); int width = metrics.widthPixels; view.setLayoutParams(new LinearLayout.LayoutParams(width, LinearLayout.LayoutParams.WRAP_CONTENT)); viewHolder = new ViewHolderHeaderOrFooter(view); } return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } @Override public int getItemCount() { // 1 for header and 1 for footer return 4 + 1 + 1; } @Override public int getItemViewType(int position) { if (isPositionHeader(position)) return TYPE_HEADER; else if (isPositionFooter(position)) return TYPE_FOOTER; return TYPE_ITEM; } private boolean isPositionHeader(int position) { return position == 0; } private boolean isPositionFooter(int position) { return position == getItemCount() - 1; } // Provide a reference to the views for each data item // Complex data items may need more than one view per item, and // you provide access to all the views for a data item in a view holder public static class ViewHolderItem extends RecyclerView.ViewHolder { // each data item is just a string in this case public View mView; public ViewHolderItem(View v) { super(v); mView = v; } } // Provide a reference to the views for each data item // Complex data items may need more than one view per item, and // you provide access to all the views for a data item in a view holder public static class ViewHolderHeaderOrFooter extends RecyclerView.ViewHolder { // each data item is just a string in this case public View mView; public ViewHolderHeaderOrFooter(View v) { super(v); mView = v; } } } 

    3. Archivo de Layout de la Actividad Principal (main.xml)

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/marqueList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:clipToPadding="false" /> </LinearLayout> 

    4. Archivo de diseño del adaptador (scroll_child.xml)

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/txtPercent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="30dp" android:paddingRight="30dp" android:text="0.14%" /> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@android:color/darker_gray" /> <TextView android:id="@+id/txtData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="30dp" android:paddingRight="30dp" android:text="data" /> </LinearLayout> 

    aumentar o disminuir pixelsToMove , este valor de variables para cambiar la velocidad

    Usted puede resolver esto usando una biblioteca, MarqueeView que he estado utilizando por algún tiempo y sus trabajos grandes. Aquí está el enlace para ello.

    Uso

    En XML ,

     <asia.ivity.android.marqueeview.MarqueeView android:id="@+id/marqueeView150" android:layout_width="150dp" android:layout_height="wrap_content" marquee:speed="5" marquee:pause="1000" marquee:autoStart="true" > <TextView android:id="@+id/textView2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do." android:textSize="20sp" android:textStyle="bold" android:singleLine="true" android:ellipsize="end" tools:ignore="HardcodedText"/> </asia.ivity.android.marqueeview.MarqueeView> 

    En Java ,

     final MarqueeView mv = (MarqueeView) findViewById(R.id.marqueeView100); mv.setPauseBetweenAnimations(500); mv.setSpeed(10); getWindow().getDecorView().post(new Runnable() { @Override public void run() { mv.startMarquee(); } }); 

    Consulte este proyecto de ejemplo para obtener más ayuda.

    Le sugeriría que utilice un único TextView dentro del MarqueeView y combinar "porcentaje" y "datos" en él.

    Usted puede absolutamente personalizar el tamaño del texto, estilo de fuente, color , etc atributos de partes de un TextView utilizando Spannable .

    Aquí está un pequeño ejemplo rápido para usted,

     Spannable spn = (Spannable) tv3.getText(); spn.setSpan(new BackgroundColorSpan(Color.RED), 0, 7,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spn.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC),0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

    Es obvio que se puede personalizar de la manera que desea dar el porcentaje y los datos de un aspecto diferente en un único TextView.

    También puede mostrar imágenes dentro de un TextView donde quiera utilizando ImageSpan ,

    Aquí está un ejemplo rápido para él,

     ImageSpan is = new ImageSpan(context, resId); text.setSpan(is, index, index + strLength, 0); 

    Sólo asegúrese de que utiliza posiciones de índice correctas de lo contrario terminará con una StringIndexOutOfBoundsException .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.