2017-06-01 121 views
1

似乎有全屏兩種定義androidplot有新的Android全屏活動不填充屏幕

的Android全屏=沒有任務欄,無狀態欄或按鈕,只需填寫屏幕

android plot全屏=沒有傳說的左右兩邊,只是一個全屏的圖形小部件

這個問題是關於Android的全屏與滑動動作,使任務欄和按鈕欄隱藏(全屏)或顯示......它不會將圖形部分擴展(填充)到底部的圖例

下面是基於Android 1.4.3的情節

創建一個新的Android 2.3.2工作室項目與空活動,並複製Android的情節演示應用程序的「簡單的XY座標圖」 Java代碼到的onCreate和XML部分到佈局xml文件中工作正常,並且圖形部分一直展開到底部圖例

創建一個全屏幕活動的新的android studio 2.3.2項目(用滑動動作隱藏/顯示任務欄和按鈕欄)設置失敗,將圖形部分向下擴展至底部圖例

android studio生成的d相比於第一示例具有空活性

線被示出具有活動EFAULT代碼框架現在更復雜的「// ZZZ ...」表示從機器人工作室的偏差生成的代碼

全屏活性的java碼開始

package com.efilabs.plotxynew; 

import android.annotation.SuppressLint; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.MotionEvent; 
import android.view.View; 

import com.androidplot.xy.XYPlot; 

/** 
* An example full-screen activity that shows and hides the system UI     (i.e. 
* status bar and navigation/system bar) with user interaction. 
*/ 
public class ActPlotNew0 extends AppCompatActivity 
{ 
    /** 
    * Whether or not the system UI should be auto-hidden after 
    * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds. 
    */ 
    private static final boolean AUTO_HIDE = true; 

    /** 
    * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after 
    * user interaction before hiding the system UI. 
    */ 
    private static final int AUTO_HIDE_DELAY_MILLIS = 3000; 

    /** 
    * Some older devices needs a small delay between UI widget updates 
    * and a change of the status and navigation bar. 
    */ 
    private static final int UI_ANIMATION_DELAY = 300; 
    private final Handler mHideHandler = new Handler(); 
    private View mContentView;  // zzz 
//private XYPlot mContentView;  // zzz 
     private final Runnable mHidePart2Runnable = new Runnable() 
     { 
    @SuppressLint ("InlinedApi") 
    @Override 
    public void run() 
    { 
     // Delayed removal of status and navigation bar 

     // Note that some of these constants are new as of API 16 (Jelly Bean) 
     // and API 19 (KitKat). It is safe to use them, as they are inclined 
     // at compile-time and do nothing on earlier devices. 
     mContentView.setSystemUiVisibility (View.SYSTEM_UI_FLAG_LOW_PROFILE 
      | View.SYSTEM_UI_FLAG_FULLSCREEN 
      | View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
      | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
      | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
      | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 
    } 
    }; 
    private View mControlsView; 
    private final Runnable mShowPart2Runnable = new Runnable() 
    { 
    @Override 
    public void run() 
    { 
     // Delayed display of UI elements 
     ActionBar actionBar = getSupportActionBar(); 
     if (actionBar != null) { 
    actionBar.show(); 
     } 
     mControlsView.setVisibility (View.VISIBLE); 
    } 
    }; 
    private boolean mVisible; 
    private final Runnable mHideRunnable = new Runnable() 
    { 
    @Override 
    public void run() 
    { 
     hide(); 
    } 
    }; 
    /** 
    * Touch listener to use for in-layout UI controls to delay hiding the 
    * system UI. This is to prevent the jarring behavior of controls going away 
    * while interacting with activity UI. 
    */ 
    private final View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() 
    { 
    @Override 
    public boolean onTouch (View view, MotionEvent motionEvent) 
    { 
     if (AUTO_HIDE) { 
    delayedHide (AUTO_HIDE_DELAY_MILLIS); 
     } 
     return false; 
    } 
    }; 

    @Override 
    protected void onCreate (Bundle savedInstanceState) 
    { 
    super.onCreate (savedInstanceState); 

    setContentView (R.layout.act_plotnew0); 

    mVisible = true; 
    mControlsView = findViewById (R.id.fullscreen_content_controls); 
    mContentView =  findViewById (R.id.fullscreen_content); // zzz 
// mContentView = (XYPlot) findViewById (R.id.fullscreen_content); // zzz 


    // Set up the user interaction to manually show or hide the system UI. 
    mContentView.setOnClickListener (new View.OnClickListener() 
    { 
     @Override 
     public void onClick (View view) 
     { 
    toggle(); 
     } 
    }); 

    // Upon interacting with UI controls, delay any scheduled hide() 
    // operations to prevent the jarring behavior of controls going away 
    // while interacting with the UI. 
    findViewById (R.id.dummy_button).setOnTouchListener  (mDelayHideTouchListener); 
    } 

    @Override 
    protected void onPostCreate (Bundle savedInstanceState) 
    { 
    super.onPostCreate (savedInstanceState); 

    // Trigger the initial hide() shortly after the activity has been 
    // created, to briefly hint to the user that UI controls 
    // are available. 
    delayedHide (100); 
    } 

    private void toggle() 
    { 
    if (mVisible) { 
     hide(); 
    } else { 
     show(); 
    } 
    } 

    private void hide() 
    { 
    // Hide UI first 
    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.hide(); 
    } 
    mControlsView.setVisibility (View.GONE); 
    mVisible = false; 

    // Schedule a runnable to remove the status and navigation bar after a delay 
    mHideHandler.removeCallbacks (mShowPart2Runnable); 
    mHideHandler.postDelayed (mHidePart2Runnable, UI_ANIMATION_DELAY); 
    } 

    @SuppressLint ("InlinedApi") 
    private void show() 
    { 
    // Show the system bar 
    mContentView.setSystemUiVisibility  (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 
    mVisible = true; 

    // Schedule a runnable to display UI elements after a delay 
    mHideHandler.removeCallbacks (mHidePart2Runnable); 
    mHideHandler.postDelayed (mShowPart2Runnable, UI_ANIMATION_DELAY); 
    } 

    /** 
    * Schedules a call to hide() in [delay] milliseconds, canceling any 
    * previously scheduled calls. 
    */ 
    private void delayedHide (int delayMillis) 
    { 
    mHideHandler.removeCallbacks (mHideRunnable); 
    mHideHandler.postDelayed (mHideRunnable, delayMillis); 
    } 
} 

全屏活動Java代碼端

XML佈局包含插入機器人情節視圖部分

全屏活動佈局XML開始

<FrameLayout 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" 
    xmlns:ap="http://schemas.android.com/apk/res-auto" 
    android:background="#0099cc" 
    tools:context="com.efilabs.plotxynew.ActPlotNew0"> 

    <!-- The primary full-screen view. This can be replaced with whatever view 
     is needed to present your content, e.g. VideoView, SurfaceView, 
     TextureView, etc. --> 
    <!--TextView 
     android:id="@+id/fullscreen_content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:keepScreenOn="true" 
     android:text="@string/dummy_content" 
     android:textColor="#33b5e5" 
     android:textSize="50sp" 
     android:textStyle="bold"/--> 

    <com.androidplot.xy.XYPlot 
     style="@style/APDefacto.Light" 
     android:id="@+id/fullscreen_content" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     ap:title="A Simple XY Plot" 
     ap:rangeTitle="range" 
     ap:domainTitle="domain" 
     ap:lineLabels="left|bottom" 
     ap:lineLabelRotationBottom="-45"/> 

    <!-- This FrameLayout insets its children based on system windows using 
     android:fitsSystemWindows. --> 
     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
     android:fitsSystemWindows="true"> 

    <LinearLayout 
     android:id="@+id/fullscreen_content_controls" 
     style="?metaButtonBarStyle" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|center_horizontal" 
     android:background="@color/black_overlay" 
     android:orientation="horizontal" 
     tools:ignore="UselessParent"> 

     <Button 
      android:id="@+id/dummy_button" 
      style="?metaButtonBarButtonStyle" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="@string/dummy_button"/> 

    </LinearLayout> 
    </FrameLayout> 

</FrameLayout> 

全屏活動佈局XML結束

爲了不亂用的Android生成的Java代碼,我創建延伸Android的一個第二java的活動類生成的java活動代碼並放置在「簡單XY繪圖」到它

擴展活動代碼開始

package com.efilabs.plotxynew; 

import android.graphics.DashPathEffect; 
import android.os.Bundle; 
import android.support.v7.app.ActionBar; 

import com.androidplot.util.PixelUtils; 
import com.androidplot.xy.CatmullRomInterpolator; 
import com.androidplot.xy.LineAndPointFormatter; 
import com.androidplot.xy.SimpleXYSeries; 
import com.androidplot.xy.XYGraphWidget; 
import com.androidplot.xy.XYPlot; 
import com.androidplot.xy.XYSeries; 

import java.text.FieldPosition; 
import java.text.Format; 
import java.text.ParsePosition; 
import java.util.Arrays; 

public class ActPlotNew0a extends ActPlotNew0 
{ 
    private XYPlot plot; 

    @Override 
    protected void onCreate (Bundle savedInstanceState) 
    { 
    super.onCreate (savedInstanceState); 
// setContentView (R.layout.act_plotnew0); // xxx provides full screen but swipe doesn't work anylonger 

    ActionBar bar = getSupportActionBar() ; 
    if  (bar != null) bar.hide() ; 

    // initialize our XYPlot reference: 
    plot = (XYPlot) findViewById(R.id.fullscreen_content); 

    // create a couple arrays of y-values to plot: 
    final Number[] domainLabels = {1, 2, 3, 6, 7, 8, 9, 10, 13, 14}; 
    Number[] series1Numbers = {1, 4, 2, 8, 4, 16, 8, 32, 16, 64}; 
    Number[] series2Numbers = {5, 2, 10, 5, 20, 10, 40, 20, 80, 40}; 

    // turn the above arrays into XYSeries': 
    // (Y_VALS_ONLY means use the element index as the x value) 
    XYSeries series1 = new SimpleXYSeries (
      Arrays.asList(series1Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Series1"); 
    XYSeries series2 = new SimpleXYSeries(
      Arrays.asList(series2Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Series2"); 

    // create formatters to use for drawing a series using LineAndPointRenderer 
    // and configure them from xml: 
    LineAndPointFormatter series1Format = 
      new LineAndPointFormatter(this, R.xml.line_point_formatter_with_labels); 

    LineAndPointFormatter series2Format = 
      new LineAndPointFormatter(this, R.xml.line_point_formatter_with_labels_2); 

    // add an "dash" effect to the series2 line: 
    series2Format.getLinePaint().setPathEffect(new DashPathEffect (new float[] 
      { 
        // always use DP when specifying pixel sizes, to keep things consistent across devices: 
        PixelUtils.dpToPix(20), 
        PixelUtils.dpToPix(15) 
      }, 0)); 

    // (optional) add some smoothing to the lines: 
    // see: http://androidplot.com/smooth-curves-and-androidplot/ 
    series1Format.setInterpolationParams(
      new CatmullRomInterpolator.Params(10, CatmullRomInterpolator.Type.Centripetal)); 

    series2Format.setInterpolationParams(
      new CatmullRomInterpolator.Params(10, CatmullRomInterpolator.Type.Centripetal)); 

    // add a new series' to the xyplot: 
    plot.addSeries(series1, series1Format); 
    plot.addSeries(series2, series2Format); 

    plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).setFormat(new Format() 
    { 
     @Override 
     public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) 
     { 
     int i = Math.round(((Number) obj).floatValue()); 
     return toAppendTo.append(domainLabels[i]); 
     } 
     @Override 
     public Object parseObject(String source, ParsePosition pos) 
     { 
     return null; 
     } 
    }); 
    } 
} 

擴展活動代碼結束

有趣的部分是,包含「... // xxx ...」的未註釋行28使全屏工作,但現在滑動手勢在隱藏/顯示任務欄和按鈕欄之間切換「不工作了

我沒有足夠的經驗來解決這個問題,就需要一些嚴重的幫助

注:以上情況會正常工作與Android 0.9的情節。圖8和將提供一個全屏幕的Android情節圖部分填充到底部圖例

this picture shows the additional rectangle portion marked in red which should be filled by the graph widget for full screen

+0

代碼此項目可以在 https://github.com/halfhp/androidplot/issues/48 – efiLabs

回答

1

問題的根本原因是小區已經被佈置和拉拔後setSystemUiVisibility(...)呼叫。這在0.9.8中不是問題,因爲XYGraphWidget會在每次平局中手動重新計算它的尺寸。這是一個昂貴的(通常)不必要的操作,但由於性能方面的原因,在以後的版本中將其刪除。

我知道這並不能解決您的使用案例(這是一個有效的案例),但是如果您擺脫postDelayed並將全屏調整代碼移動到onCreate,則全屏模式將正確顯示。

我正在研究圖形渲染邏輯的替代實現,希望避免性能問題,同時支持1.4.5版本的用例。它不應該要求您更改任何代碼。

與此同時,一個簡單的辦法是立即採取以下措施後setSystemUiVisibility

plot.getGraph().setGridRect(null); 
plot.redraw(); 
+0

試過你的建議 – efiLabs

0

想你的建議,並放置以下後mContentView.setSystemUiVisibility(...)圍繞線運行的部分58

plot.getGraph().setGridRect (null) ; 
plot.getGraph().setLabelRect (null) ; 
plot.redraw() ; 

和它的作品現在...在這裏給出的簡單的例子,它需要步進式顯示/隱藏/顯示,但在我真正的代碼,它在打開活動

作品的權利

關於「擺脫postDelayed」我不太確定如何實現這一點,我不是一個像你一樣的android內部專家......但現在我有一個似乎工作的解決方案

這將我的開發週期的延續過程中的工作和我做的時候,我希望將1.4.5解決這個問題

很多很多感謝的快速響應