특정 이미지를 색칠공부 그림으로 만들어 줍니다.

 

1. 아래 초기화면에서 이미지를 열고

 

2. 선추출하기 버튼을 클릭을 하면 아래 처럼 선만 표시가 되고 선추출하기 옆 스크롤을 이용해 선 표시 정도를 보정합니다.  

 

3. 그리기 기능을 이용해 white, black 버튼을 이용해 선을 그을수 있고 Select 버튼은 색을 지정할 수 있습니다. (굵기도 지정)

  (이 상태에서도 컴퓨터로 색칠 공부가 가능합니다. 그러나 채우기 안됨; 실행 취소 안됨;)

 

4. Print 합니다.

색칠공부 시작~!

 

아래 첨부를 다운받아서

ImageToSketch.exe 를 실행합니다.

오류가 있을수 있습니다.

버그 발견시 계속 수정해서 올릴예정입니다.

(소스는 정리가되면;)

ImageToSketch.z01

ImageToSketch.z02

ImageToSketch.zip

 


광고야 고맙다^^

'Life' 카테고리의 다른 글

드디어 애드센스 1000달러 돌파  (0) 2019.01.23
하담이가 만든 서있는 악어  (0) 2019.01.08
강제 환기 (제로홈) 설치 후기  (0) 2019.01.06
실력이점점 늘어가는 하담이  (0) 2019.01.01
올해의 다짐  (0) 2019.01.01
올해의 목표  (0) 2019.01.01

'MiGong' 카테고리의 다른 글

2019.01.22 미공 데이터  (0) 2019.01.23
2019.1.16 미공 데이터  (0) 2019.01.16
2019.1.14 미공 데이터  (0) 2019.01.14
2019.01.12 미공 데이터  (0) 2019.01.12
2019.1.8 미공 데이터  (0) 2019.01.08
2019.1.3 미공 데이터  (0) 2019.01.04

하드코딩은 여러가지가 있지만 이 프로그램에서는 문자열을 class 의 필드로 바꿔주는 기능을 가지고 있습니다.

 

* 사용방법

1. 소스를 긁어서 붙여넣기 합니다.

2. Search 버튼을 클릭 합니다.

  Search 를 하면 왼쪽 목록에 문자열 목록이 나열됩니다.
  목록중 하나를 선택하면 소스의 해당 문자열 위치로 이동하여 표시됩니다. (밑줄, 굵게표시)
  여기에서 해당 사항이 아닌 항목은 del 키나 delete item 버튼으로 목록에서 제거 할수 있습니다.

 

3. ClassName 을 입력합니다.

   만들어질 class 의 명입니다.
   Prefix 는 필드명 앞에 붙여질 첨자입니다.

 

4. Make Field 버튼을 클릭합니다.

  목록의 내용을 가지고 class 생성 코드를 만들어 보여줍니다.

 

5. Change 버튼을 클릭합니다.

   만들어진 class 를 기준으로 문자열을 변경하여 보여줍니다.
   변경된 내용은 검은색 바탕의 횐색 글자로 보여집니다.

 

exe 파일

HardCodingAutoChanger.exe

 

소스

https://github.com/kjundev/HardCodingAutoChanger

 

window form 에서 unity 게임을 실행하는 소스입니다.

https://github.com/kjundev/WinFormUnity

 

winform

 

CefSharp

 

Animation Text 에 이어 Animation Button 입니다.

AnimationButton 으로 명명을 하지 않은 이유는 이쪽은 앞으로 여러가지 기능이 추가될 예정이기 때문입니다.

.NET Standard 에 클래스 추가후 아래와같이 코딩합니다.

버튼이 눌렸을때 살짝 작아졌다 다시 원래 크기로 돌아오는 에니메이션을 적용한 내용입니다.

using Xamarin.Forms;

namespace Test.Cntrol
{
    public class CustomButton : Button
    {
        public CustomButton() : base()
        {
            const int animationTime = 50;

            Clicked += async (sender, e) =>
            {
                var btn = (CustomButton)sender;
                await btn.ScaleTo(0.8, animationTime, Easing.SinOut);
                await btn.ScaleTo(1, animationTime, Easing.SinIn);
            };
        }
    }
}

 

 

이제 화면 Page 에서 컨트롤을 위치시킵니다.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:Text"
             xmlns:cntrol="clr-namespace:Text.Cntrol"
             x:Class="Text.MainPage">

    <StackLayout Spacing="5">
        <Label Text="Welcome to Xamarin.Forms!" HorizontalOptions="Center" />
        <cntrol:AnimationText Text="Welcome to Xamarin.Forms" IsRunning="True" TextColor="Blue" HorizontalOptions="Center" Margin="0,15,0,15"/>
        <cntrol:CustomButton Text="Custom Button" WidthRequest="130" HeightRequest="40" HorizontalOptions="Center"
                             BackgroundColor="#81BE1D" CornerRadius="3" TextColor="White"/>

       
    </StackLayout>

</ContentPage>

 

아래는 결과 화면입니다.

Text 에 Animation 을 적용하여 글자가 순서대로 커졌다가 작아지는 효과를 주는 방법입니다.

.NET Standard 프로젝트에 클래스를 추가하여 아래와 같이 코딩합니다.

using Xamarin.Forms;

namespace Test.Cntrol
{
    public class AnimationText : StackLayout
    {
        private const string AnimationName = "AnimatedTextAnimation";

        public static readonly BindableProperty IsRunningProperty
            = BindableProperty.Create(nameof(IsRunning), typeof(bool), typeof(AnimationText), default(bool));

        public static readonly BindableProperty TextProperty
            = BindableProperty.Create(nameof(Text), typeof(string), typeof(AnimationText), default(string));

        private Animation animation;

        public AnimationText()
        {
            Orientation = StackOrientation.Horizontal;
            Spacing = -1;
        }

        public bool IsRunning
        {
            get => (bool)GetValue(IsRunningProperty);
            set => SetValue(IsRunningProperty, value);
        }

        public string Text
        {
            get => (string)GetValue(TextProperty);
            set => SetValue(TextProperty, value);
        }

        public Color TextColor { get; set; } = Color.Blue;

        protected override void OnPropertyChanged(string propertyName = null)
        {
            base.OnPropertyChanged(propertyName);

            if (propertyName == nameof(IsRunning) && IsEnabled)
            {
                if (IsRunning)
                {
                    StartAnimation();
                }
                else
                {
                    StopAnimation();
                }
            }

            if (propertyName == nameof(Text))
            {
                InitAnimation();
            }
        }

        private void InitAnimation()
        {
            this.animation = new Animation();
            Children.Clear();

            if (string.IsNullOrWhiteSpace(Text)) return;

            var index = 0;
            foreach (var textChar in Text)
            {
                var label = new Label
                {
                    Text = textChar.ToString(),
                    TextColor = this.TextColor,
                    FontAttributes = FontAttributes.Bold,
                    FontSize = 12
                };

                Children.Add(label);

                var oneCharAnimationLength = (double)1 / (Text.Length + 1);

                this.animation.Add(index * oneCharAnimationLength, (index + 1) * oneCharAnimationLength, 
                  new Animation(v => label.Scale = v, 1, 1.75, Easing.Linear));
                this.animation.Add((index + 1) * oneCharAnimationLength, (index + 2) * oneCharAnimationLength, 
                  new Animation(v => label.Scale = v, 1.75, 1, Easing.Linear));

                this.animation.Add(index * oneCharAnimationLength, (index + 1) * oneCharAnimationLength, 
                  new Animation(v => label.TranslationY = v, 0, -10, Easing.Linear));
                this.animation.Add((index + 1) * oneCharAnimationLength, (index + 2) * oneCharAnimationLength, 
                  new Animation(v => label.TranslationY = v, -10, 0, Easing.Linear));

                index++;
            }
        }

        private void StartAnimation()
        {
            animation.Commit(this, AnimationName, 16, (uint)Children.Count * 200, Easing.Linear, null, () => true);
        }

        private void StopAnimation()
        {
            this.AbortAnimation(AnimationName);
        }
    }
}

 

이제 Page 의 화면단에 아래와 같이 컨트롤을 위치시킵니다.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:Test"
             xmlns:cntrol="clr-namespace:Test.Cntrol"
             x:Class="Test.MainPage">

    <StackLayout>
        <Label Text="Welcome to Xamarin.Forms!" HorizontalOptions="Center" />
        <cntrol:AnimationText Text="Welcome to Xamarin.Forms" IsRunning="True" HorizontalOptions="Center"/>
    </StackLayout>

</ContentPage>

아래는 실행결과 입니다.

안드로이드, iOS 모두 정상적으로 동작합니다.^^

 

 

 

 

요즘들어 자꾸 컴퓨터가 블루 스크린이 뜬다.

컴퓨터 부팅시 KMODE_EXCEPTION_NOT_HANDLED 에러가 발생되었는데

찾아보니 아래 처럼 인터넷 옵션에서 보호모드 사용을 꺼줘야 한다고 한다.

 

 

익스플로러를 켠상태에서 윈도우를 재시작 하면 익스플로러가 다시 켜지는데

그때 에러가 발생되는것 같다.

 

그런데 보호모드 사용을 꺼줘도 되는건지 모르겠다;';

미공은 미세먼지 공유하기의 줄임말로 개인이 가지고 있는 측정기 수치를 공유하는 어플입니다.

안드로이드 : https://play.google.com/store/apps/details?id=kr.kjun.MiGong

아이폰 : https://itunes.apple.com/kr/app/%EB%AF%B8%EA%B3%B5/id1419950526?mt=8

 

아래는 초기 화면으로 메뉴는 크게 4가지 입니다.

측정치공유하기 - 개인 측정기의 정보를 공유하는 메뉴입니다.

측정치게시판 - 공유한 정보를 확인하는 게시판 메뉴입니다.

미세먼지예보 - 미세먼지 예보 정보를 보여줍니다.

미세먼지사이트정보 - 사이트에서 제공하는 정보를 보여줍니다.

 

우측 상단의 카카오플러스 친구 버튼이 있으며 플러스 친구를 통해 중요한 공지는 발송됩니다.

https://pf.kakao.com/_KxoRxkC

 

1. 측정치공유하기

 

측정치를 공유하는 화면으로 주소를 동 기준으로 검색하여 주소를 설정하고

사용자 명과 기기명칭을 적고 기억하기를 합니다.

(기억하기를 하면 상단의 내용은 계속 고정됩니다.)

비밀번호는 나중에 게시물 수정/삭제시 사용됩니다.

수치(pm2.5 필수)를 적고 사진이 있다면 넣거나 찍습니다.

 

2. 측정치게시판

공유한 측정기 데이터가 리스트되어 보여집니다.

리스트된 항목을 클릭하면 아래와 같이 공유한 항목중 사진정보와 내용을 포함하여 확인할 수 있습니다.

사진을 클릭하면 확대하여 볼수 있습니다.

지도모양의 아이콘을 클릭하면 아래와 같이 지도에 현재 위치기준 개측기 수치정보와

기상청(AirKorea) 및 AirBox 데이터가 표시됩니다.

 

아래 처럼 개측기만 버튼을 누르면 개측기 데이터만 나타납니다.

시간 버튼을 클릭하면 해당 시간 이내 정보만 지도에 표시됩니다.

 

위치정보를 입력하고 검색하기를 하면 주소를 검색하여 지도에 표시합니다.

 

3. 미세먼지예보

 

미세먼지예보는 공공데이터에서 오늘 내일 모레 정보의 예보 정보를 나타내며

안양대 탭에서는 안양대(한국 대기질 예보시스템) 에서 제공하는 예보 정보를 보여줍니다.

 

4. 미세먼지사이트 정보 (nullschool, windy, aqicn, 에어코리아 사이트 정보)

실시간으로 미세먼지 위성 이미지 및 수치 정보를 나타내는 사이트를 보여줍니다.

 

기타..

랭킹보기 메뉴

공유한 사용자에대한 공유 횟수 정보가 표시됩니다.

 

사이드메뉴구성은 아래와 같습니다.

 

정보 업데이트를 선택하면 구글플레이/AppStore 로 이동합니다.

(실시간 수치는 개발중..)

아래는 홈화면입니다.

우측 상단의 종모양 이미지를 클릭하면 공지사항이 표시됩니다.

구글맵 적용전 apk 파일

42.z01

42.zip

 

+ Recent posts

티스토리 툴바