• Mac book pro 2017 13’ что то стучит в крышке при поворотах ...?

    AlexMarken
    @AlexMarken
    Жить можно, но на твоём месте отнес бы в авторизованный СЦ (не через магазин, а напрямую). На моём MacBook Pro 2017 15'' никаких подобных звуков нет. Скорее всего, шарниры нужно подтянуть, или это брак.

    Ничего страшного, это норма для 2017
    сказано выше. Для 2016 года это была норма, в 2017 залатали все проблемы. В общем, не мучай себя, а отнести в СЦ. За 6-10 дней разберутся.
    Ответ написан
  • Как убрать битые сектора на жестком диске в macos sierra high?

    AlexMarken
    @AlexMarken
    Битые сектора означают физическое повреждение диска. Убрать ты их не сможешь. Можно только воспользоваться REMAP в утилите Victoria - сделает поврежденные сектора неактивными. Это на время решит твою проблему, т.к. диск уже физически повреждён, рано или поздно (скорее рано) диск откажет совсем.

    Информация, которая была в битых секторах, не подлежит восстановлению обычными утилитами (PRO решения, восстанавливающие на основе ИИ, на дороге не валяются). Посекторное резервное копирование тоже не имеет смысла - читай выше (ещё раз).

    Копируй с диска всю необходимую информацию и покупай новый HDD. Больше никак.
    Ответ написан
  • Как создать tabs во фрагменте?

    AlexMarken
    @AlexMarken
    Помещаешь TabItem на разметку TabLayout. Вот пример:

    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabIndicatorColor="@color/white"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="@color/colorText"
        app:tabTextColor="@color/colorSecondaryText">
    
        <android.support.design.widget.TabItem
          android:id="@+id/tabItem1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Tab1" />
    </android.support.design.widget.TabLayout>
    Ответ написан
  • И все таки с чего начать новичку?

    AlexMarken
    @AlexMarken
    Для Android - Java & Kotlin в среде Android Studio, эмулятор Genymotion.
    Для iOS - Swift в xCode.

    На C# и Delphi, которые позволяют сегодня создавать мульти-платформенные приложения, писать не советую. Там очень много нюансов, которые ухудшают производительность приложения и ограничивают возможности. Пиши на родном для платформы языке.
    Ответ написан
    Комментировать
  • Как устранить ошибку out of memory в андроид студио?

    AlexMarken
    @AlexMarken
    Пошарь в разделе dependencies файла build.gradle. Такое ощущение, что ты недавно добавил косячные модули к приложению. У меня такая ошибка возникала в двух случаях: либо подключенный модуль был кривой, либо подключенная библиотека уже имела пакеты, которые содержатся в других модулях.

    Залей содержимое build.gradle в комментарий. Посмотрю, что там у тебя.

    Если проблема иная, можешь добавить в gradle.properties строку:
    org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

    После этой операции, сделай Clean и Rebuild проекта, потом Invalid Cache Android Studio. С "MaxPermSize" можешь поиграться до 2048.
    Ответ написан
    2 комментария
  • Как при клике на элемент ListView присвоить значение переменной?

    AlexMarken
    @AlexMarken
    Во-первых, определяй нажатую строку не по position, а параметром id. Position - позиция элемента в View (при нехватки памяти происходит пересоздание элементов адаптера во View, из-за этого в редких случаях для разных элементов параметр position может быть один и тот же), id - порядковый номер в адаптере.

    Во-вторых, проблема в switch на методе onItemClick. У тебя не исполняется ни одно условие, по этому изменение значения переменной znachn1 не происходит. Поступи проще, без всяких switch (эта конструкция является дурным тоном):

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position2, long id) {
        znachn1 = (id < 9) ? 9 - id : 0;
    }
    Ответ написан
    5 комментариев
  • Какой эмулятор для Android выбрать под Windows?

    AlexMarken
    @AlexMarken
    Лучше всего использовать Genymotion, есть бесплатная версия для personal. Имеется интеграция с Android Studio, позволяет установить Google APPS.
    Ответ написан
    Комментировать
  • Как создать свою карту на Андроид со своими маркерами?

    AlexMarken
    @AlexMarken
    Смотри в сторону использования ImageView. Создаешь собственный класс, родителем которого является ImageView. При создании объекта или вызова иного метода накладываешь рисунок (фон) карты. Подключаешь методы onTouchEvent (обработчик нажатия на элемент, к пример, для клика на нарисованный маркер или объект), onDraw (отрисовка элементов через Canvas, в моём случае на карте рисую метки и маршрут) и другие.

    Грубо говоря, ты соберешь свой собственный ImageView, который будет выполнять все нужные действия.

    Класс у меня большой, кину несколько моментов.

    Конструктор
    public DrawView(Context context, View parent, String appName) {
            super(context);
    
            navigator = MainActivity.university.getNavigator();
    
            setHorizontalScrollBarEnabled(true);
            setVerticalScrollBarEnabled(true);
    
            markers = new naviMarkers();
    
            gestureDetector = new GestureDetector(context, new MyGestureListener());
            scaleGestureDetector = new ScaleGestureDetector(context, new MyScaleGestureListener());
            scroller = new Scroller(context);
    
            final TypedArray a = (TypedArray) context.obtainStyledAttributes(R.styleable.View);
            a.recycle();
    
            CheckDisplay();
    
            p = new Paint();
    
            loadImage(corp, stage);
    
            AdaptToScreen(false, ScreenWidth, ScreenHeight);
        }


    Отрисовка маркеров и маршрутов:
    @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawARGB(0, 0, 0, 0);
    
            markers.markersRefresh(30, 30);
            Rect rect = new Rect(0, 0, getScaledWidth(), getScaledHeight());
            canvas.drawBitmap(image, null, rect, p);
    
            p.setStyle(Paint.Style.FILL);
            p.setAntiAlias(true);
            //p.setColor(Color.RED);
    
            float minWidth = 0;
    
            if (isCampus)
                minWidth = (float) (getWidth() * 0.065);
            else
                minWidth = (float) (getWidth() * 0.059);
            float kWidth = (int) (minWidth * (scaleFactor));
    
            if (kWidth < minWidth)
                kWidth = (int) minWidth;
    
            MarkerWidth = kWidth;
            MarkerHeight = kWidth;
    
            markers.markersRefresh(MarkerWidth, MarkerHeight);
    
            naviCampus nCampus = navigator.getCampus();
    
            if (isCampus) {
                for(int i = 1; i <= nCampus.getCount(); i++) {
                    naviCorp corp = nCampus.getCorpus(i);
    
                    if (corp != null) {
    
                        Bitmap marker = markers.getMarker(naviMarkers.ID_MARKER_CAMPUS);
    
                        if (marker != null)
                            canvas.drawBitmap(marker, corp.getX() * scaleFactor - marker.getWidth() / 2,
                                    corp.getY() * scaleFactor - marker.getHeight() / 2, p);
                    }
                }
            }
            else {
                ArrayList<naviAuditor> auditorlist = nCampus.getCorpus(corp).getAuditors(stage);
    
                // Рисуем точки аудиторий
                if ((isAuditor) && (scaleFactor >= 0.7)) {
                    for (int i = 0; i < auditorlist.size(); i++) {
                        naviAuditor auditor = auditorlist.get(i);
    
                        Bitmap marker = markers.getMarker(naviMarkers.ID_MARKER_AUDITOR);
    
                        if (marker != null)
                            canvas.drawBitmap(marker, auditor.getX() * scaleFactor - marker.getWidth() / 2,
                                    auditor.getY() * scaleFactor - marker.getHeight() / 2, p);
    
                        //canvas.drawCircle(auditor.getX() * scaleFactor, auditor.getY() * scaleFactor, 20, p);
                    }
                }
    
                // Рисуем лестницы
                if ((isSteps) && (steps != null)) {
    
                    for (int i = 0; i < steps.size(); i++) {
                        Bitmap marker = markers.getMarker(naviMarkers.ID_MARKER_STEPS);
    
                        if (marker != null)
                            canvas.drawBitmap(marker, steps.get(i).getX() * scaleFactor - marker.getWidth() / 2,
                                    steps.get(i).getY() * scaleFactor - marker.getHeight() / 2, p);
                    }
                }
    
                // Отображаем маршрут
                if (points != null) {
                    p.setStrokeWidth(9 * getResources().getDisplayMetrics().density * scaleFactor);
                    p.setColor(Color.RED);
                    p.setStrokeMiter(0);
    
                    naviGraps gr = navigator.getGraps();
    
                    Point pBeginNavi = null, pEndNavi = null;
                    ArrayList<Point> pGraphicsSteps = new ArrayList<>(); // begin-..STEPS..-end
    
                    Path path = new Path();
                    boolean first_point = false;
    
                    for(int i = 0; i < points.FItems.size() - 1; i++) {
                        int bPoint = points.FItems.get(i);
                        int ePoint = points.FItems.get(i + 1);
    
    
                        if ((gr.Points.get(bPoint).getStage() == stage) &&
                                (gr.Points.get(bPoint).getStage() == gr.Points.get(ePoint).getStage())) {
                            float X1 = gr.Points.get(bPoint).getX() * scaleFactor;
                            float Y1 = gr.Points.get(bPoint).getY() * scaleFactor;
    
                            float X2 = gr.Points.get(ePoint).getX() * scaleFactor;
                            float Y2 = gr.Points.get(ePoint).getY() * scaleFactor;
    
                            if (!first_point) {
                                path.moveTo(X1, Y1);
                                first_point = true;
                            }
    
                            path.lineTo(X2, Y2);
    
                            if (i == 0)
                                pBeginNavi = new Point((int)X1, (int)Y1);
                            else if (i ==  points.FItems.size() - 2)
                                pEndNavi = new Point((int)X2, (int)Y2);
                        }
                    }
    
                    p.setStyle(Paint.Style.STROKE);
                    canvas.drawPath(path, p);
    
                    if (pBeginNavi != null) {
                        Bitmap marker = markers.getMarker(naviMarkers.ID_MARKER_POINT_A);
    
                        if (marker != null)
                            canvas.drawBitmap(marker, pBeginNavi.x - marker.getWidth() / 2, pBeginNavi.y - marker.getHeight() / 2, p);
                    }
    
                    if (pEndNavi != null) {
                        Bitmap marker = markers.getMarker(naviMarkers.ID_MARKER_POINT_B);
    
                        if (marker != null)
                            canvas.drawBitmap(marker, pEndNavi.x - marker.getWidth() / 2, pEndNavi.y - marker.getHeight() / 2, p);
                    }
                }
    
                if ((isSearch) && (activeAuditory != null)) {
                    int findInd = -1;
    
                    for (int i = 0; (i < auditorlist.size()) && (findInd == -1); i++)
                        if (activeAuditory.equals(auditorlist.get(i).getAuditor()))
                            findInd = i;
    
                    if (findInd != -1) {
                        naviAuditor auditor = auditorlist.get(findInd);
    
                        Bitmap marker = markers.getMarker(naviMarkers.ID_MARKER_AUDITOR);
    
                        if (marker != null)
                            canvas.drawBitmap(marker, auditor.getX() * scaleFactor - marker.getWidth() / 2,
                                    auditor.getY() * scaleFactor - marker.getHeight() / 2, p);
                    }
                }
            }
        }


    Обработка нажатий на карту
    @Override
        public boolean onTouchEvent(MotionEvent event)
        {
            if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) {
                if (!scroller.isFinished()) scroller.abortAnimation();
            }
    
            scaleGestureDetector.onTouchEvent(event);
    
            if (gestureDetector.onTouchEvent(event)) {
                return true;
            }
    
            if ((event.getPointerCount() == 1) && ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP))
            {
                int newScrollX = getScrollX();
                if (getScaledWidth() < getWidth()) newScrollX = -(getWidth() - getScaledWidth()) / 2;
                else if (getScrollX() < 0) newScrollX = 0;
                else if (getScrollX() > getScaledWidth() - getWidth()) newScrollX = getScaledWidth() - getWidth();
    
                int newScrollY = getScrollY();
                if (getScaledHeight() < getHeight()) newScrollY = -(getHeight() - getScaledHeight()) / 2;
                else if (getScrollY() < 0) newScrollY = 0;
                else if (getScrollY() > getScaledHeight() - getHeight()) newScrollY = getScaledHeight() - getHeight();
    
                if ((newScrollX != getScrollX()) || (newScrollY != getScrollY()))
                {
                    scroller.startScroll(getScrollX(), getScrollY(), newScrollX - getScrollX(), newScrollY - getScrollY());
                    awakenScrollBars(scroller.getDuration());
                    computeScroll();
                    return true;
                }
            }
    
            if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE) {
                return true;
            }
    
            if ((event.getPointerCount() == 1) && (event.getAction() == MotionEvent.ACTION_UP) && (event.getAction() != MotionEvent.ACTION_MOVE)) {
                clickOnMarker(getScrollX() + (int) event.getX(), getScrollY() + (int) event.getY(), event);
    
                return true;
            }
    
            return true;
        }
    Ответ написан
    Комментировать